Eu tenho um script que executa outro script para cada linha em um arquivo.
Quando echo
cada um $line
pode ver o conteúdo completo da linha conforme o esperado.
connect.sh
No entanto, apenas dentro $1
é definido como user\ name
.
Quando tento usar "$line"
, acaba $1
sendo .connect.sh
user\ name user\ password
Como posso configurar o fluxo do programa para que reboot.sh
passe cada linha de /tmp/history
to connect.sh
como 2 parâmetros.
Com o resultado final que $1
é user\ name
e $2
é user\ password
?
reiniciar.sh:
if [ -e "/tmp/history" ]; then
while read -r line; do
echo $line
connect.sh $line \
&& break
done </tmp/history
fi
conectar.sh:
echo $1
echo $2
/tmp/história:
user\ name user\ password
Presumo que as barras invertidas existam para escapar dos dois espaços para que não separem os valores.
Com
read -r line
você obtém a linha inteira na variávelline
, de modo queline
contenhauser\ name user\ password
, com os backspaces. Não é fácil dividir isso sem truques comeval
. Um sem aspas$line
será dividido em espaço em branco, barra invertida ou não. Citado, ele se expande em uma palavra, como você viu.Felizmente,
read
pode lidar com barras invertidas e dividir sua entrada em duas (ou mais) variáveis. Isso teria as variáveis contendouser name
euser password
(com as barras invertidas removidas):No entanto, se você deseja permitir espaços em branco no nome de usuário e na senha, pode ser melhor usar algum outro delimitador que não seja o espaço. Dois pontos são comuns, então você teria uma entrada como esta:
E então leia com
(Isso deve funcionar, desde que a senha não termine com dois pontos)
Se você tiver um argumento com espaços, precisará certificar-se de colocar aspas duplas na string para evitar
connect.sh
interpretá-la como vários argumentos. Você pode querer dividir a string em vários argumentos. Não tenho certeza de qual é o formato da linha, mas você pode fazer algo assim:Isso deve imprimir:
Você provavelmente precisará fazer alguns ajustes com base no formato real da linha de entrada. Por exemplo, se sua linha $ tiver o nome de usuário e a senha de usuário separados por vírgula, você pode executar:
Apenas lembre-se de que, se estiver passando um argumento para um programa e esse argumento tiver espaços, você precisará usar aspas duplas para fazer com que o programa o veja como um único argumento.