Eu tenho um arquivo de texto com várias linhas. Estou usando o comando while para ler o arquivo em linha, mas preciso armazenar os valores em variáveis separadas e usá-los no script de shell final.
OcorteO comando delimita o arquivo completo e não a linha de leitura.
Exemplo my_file.txt
:
d1:jobid1
id2:jobid2
Estou usando o loop while abaixo para ler o arquivo em linha
while IFS= read -r line; do
jobid=`cut -d: -f2`
id=`cut -d: -f1`
#remaining shell-script dependent upon variables#
done < my_file.txt
Quero armazenar o jobid e o id de cada linha my_file.txt
e executar o script final.Cada linha está em uma nova linha
Precisa de ajuda para armazenar os valores nas variáveis de forma recursiva. Se houver uma maneira melhor de ler as linhas, delimitar e armazenar os dois campos separadamente.
Responder1
cut
lê a partir da entrada padrão por padrão. Na sua substituição de comando, a entrada padrão é herdada da entrada padrão do loop (já que você não fornece nenhuma outra entrada explícita para as chamadas para cut
). A entrada padrão do loop vem do seu arquivo de entrada.
O efeito é que a primeira linha do seu arquivo é lida por read
, enquanto todas as outras linhas são lidas pela primeira chamada para cut
. O valor na jobid
variável seria, portanto, uma sequência de IDs de trabalho delimitada por nova linha, enquanto a id
variável estaria vazia. O loop executaria apenas uma única iteração.
Vocêpoderia usar, por exemplo,
id=$( printf '%s\n' "$line" | cut -d: -f1 )
# or: id=$( cut -d: -f1 <<<"$line" )
# (in shells that supports "here-strings")
mas isso seria desnecessário, pois seria mais limpo e muito mais eficiente fazer
while IFS=: read -r id jobid; do
# code that uses "$id" and "$jobid" goes here
done <my_file.txt
Isso usa o fato de read
poder ler dados de uma linha de entrada em múltiplas variáveis ao mesmo tempo. Ao definir IFS
dois pontos, a linha é dividida nos dois pontos e o primeiro campo é lido id
enquanto o restante é lido jobid
. Não há necessidade de ligar cut
.