Eu tenho um script que faz uso de vários argumentos (ou seja, posicionais) da linha de comando e, dentro dele, um for
loop que itera por meio desses argumentos:
for i in "$@"; do
...
done
Isso significa que os argumentos são preenchidos $i
um por um, na ordem em que são especificados na linha de comando.
Isso parece significar que é impossível selecionar um argumento que não esteja sendo preenchido no momento $i
.
Por exemplo, na linha a seguir no meu script, preciso referenciar duas variáveis diferentes, que fora de um for
loop seriam $1
, $2
e $1
respectivamente:
ffmpeg -i "$i" -i "$i" ... "${i%.*}.mp4"
O script é executado no seguinte formato:
./script.sh image.jpg *.flac
...mas pelo que entendi, esse problema se aplicaria até mesmo a scripts que não funcionam com globs.
É possível acessar argumentos posicionais de um for
loop conforme necessário, em vez de simplesmente na ordem em que são especificados?
Consegui descobrir isso no final, embora não considere isso uma resposta perfeita para a pergunta porque não atende ao requisito de poder referenciar os argumentos de dentro do
for
loop.Nesse sentido, vejo essa resposta mais como uma solução alternativa e estou mais do que feliz que outra pessoa apareça e responda diretamente à pergunta de uma maneira mais abrangente. De qualquer forma, é uma solução alternativa que funciona para meu script atual.
Até onde eu sei, isso funciona atribuindo o primeiro argumento a uma variável
$img
fora dofor
loop. Cada instância de$img
no script é processada e descartada porshift
(que é o mesmo queshift 1
) antes de passar para a próxima.Depois que todos os argumentos $img forem removidos da lista de argumentos, o
for
loop usará o$@
para percorrer os argumentos restantes normalmente.O script pode então ser chamado com algo como:
Ou para várias instâncias da
$img
variável: