Digamos que eu crie um arquivo ~/myScript.sh
:
#!/bin/sh
for myVar; do
echo "Hi"
done
Se eu executar bash myScript
sem argumentos, não obterei nada, mas se executar com um ou mais argumentos, obterei a saída pelo número dessas variáveis (a variável parece tornar o script dependente dos argumentos passados) :
bash ~/myScript.sh arg0 arg1
O loop for, que é baseado na variável indefinida myVar
, aplicaria arg0
e arg1
a si mesmo (desculpe se esta frase é ruim) e obterei esta saída:
Oi
Oi
(um "Hi" por argumento).
Originalmente, presumi que um for
loop funciona com um argumento, portanto, se eu tivesse myVar_0
e myVar_1
com arg0
e arg1
, myVar_0
trabalharia com arg_0
e myVar_1
funcionaria com arg1
, mas testei mais e estava errado --- todos os for
loops funcionaram com todos os argumentos:
#!/bin/sh
for myVar_0; do
echo "Hi"
done
for myVar_1; do
echo "Hello"
done
retornará em bash myScript arg0 arg1
:
Oi
olá
Oi
olá
Observação: presumo que, se quiser "1 argumento por 1 loop for", só preciso usar uma função Bash para escopo local.
Minha pergunta
Qual é o nome dessa correspondência "todos os argumentos por todos os loops for" que o Bash faz?
myVar
não é indefinido se o script for chamado com parâmetros posicionais. Do homem bash:Mas você não usa
$myVar
.O
for
loop no shell Bash / POSIX é semelhante, por exemplo, aofor
loop em Python: a variável do loop recebe os valores listados, um por um, e o corpo do loop é executado uma vez para cada valor.Então, é isso:
é similar a
exceto que você não precisa repetir o corpo do loop. Se tivermos uma variável de array
A
, faz umfor x in "${A[@]}"; do...
loop sobre os valores do array. Da mesma formafor x in "$@"; do...
, faz um loop sobre os parâmetros posicionais, ou seja, os argumentos da linha de comando, já que são eles que"$@"
se expandem. Efor x; do
é basicamente apenas uma abreviação parafor x in "$@"; do
Então, isso imprimiria todos os argumentos da linha de comando:
Para acessar os argumentos diretamente pelo índice, use
$1
para o primeiro,$2
para o segundo argumento, etc...