
Eu tenho o seguinte comando em um script Linux.
#!/bin/bash
for i in "001 ARG1" "002 ARG2" "003 ARG3"
do
set -- $i
echo $1
echo $2
done
001 e ARG1 são essencialmente tuplas,
Existe uma maneira de mover essas tuplas para um arquivo de texto que eu possa carregar no forloop? tantos que eu salvaria um arquivo de texto como este
ARG1
ARG2
ARG3
ou
001 ARG1
002 ARG2
003 ARG3
E o roteiro seria
for i in textfile.txt
do
set -- $i
echo $1
echo $2
done
e obter o mesmo resultado?
também existe uma maneira de fazer com que 001 002 seja contado automaticamente? Da mesma forma que em python alguém poderia definir counter = 0 e counter+=1 e atribuir uma variável.
Responder1
Dadas duas palavras separadas por espaço ou tabulação em cada linha de um arquivo, como no segundo exemplo do arquivo de entrada:
while read -r word1 word2; do
echo "$word1"
echo "$word2"
done <textfile.txt
Isso leria a primeira palavra de cada linha $word1
e o restante da linha $word2
.
A entrada para read
é dada pela entrada do while
comando composto, que a obtém do arquivo por meio de um redirecionamento.
A -r
opção de read
impedir que ele seja interpretado \
de alguma forma especial, caso esse caractere ocorresse na entrada.
Com uma única palavra por linha e um contador:
counter=0
while read -r word; do
counter=$(( counter + 1 ))
echo "$counter"
echo "$word"
done <textfile.txt
Isso aumentaria o contador em um em cada iteração (para cada linha lida textfile.txt
).
Para obter um contador de três dígitos preenchido com zero, produza o contador usando printf
uma sequência de formatação de %.3d\n
:
printf '%.3d\n' "$counter"
... no lugar de echo "$counter"
.
Para obter uma descrição do que %.3d\n
significa, consulte a documentação da função da biblioteca C printf
( man 3 printf
, o equivalente do shell usa principalmente a mesma string de formato).