$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