$1
é simplesmente o primeiro parâmetro passado para o seu script de shell. Então, se você tem um script myscript
e eu chamo assim:
myscript somefile
Em seguida, $1
será somefile
. Se eu chamo assim:
myscript *
E existem arquivos no meu diretório atual:
foo bar baz
Em seguida, $1
será foo
. Em ambos os casos, $1
tem apenas um único valor e não há nada para fazer o loop.
Existem algumas maneiras de repetir os argumentos. O mais comum é:
for file in "$@"; do
echo doing something with "$file"
done
Observe que $@
não é o mesmo que "$@"
; o último é uma construção especial que lidará corretamente com nomes de arquivos que contenham espaços. Você também pode fazer algo como:
while [ -n "$1" ]; do
echo doing something with "$1"
shift
done
Aqui, o comando shift
descarta o primeiro parâmetro e $2
se torna $1
(e assim por diante). Isso fará um loop, contanto que $1
não esteja vazio. Você também pode usar $#
para isso (uma variável que contém o número de argumentos da linha de comando):
while [ $# -gt 0 ]; do
echo arg: "$1"
shift
done