Eu não acho que entendo completamente as nuances da citação no bash.
Eu tenho um script, foo.sh
, que simplesmente exibe argumentos numerados.
#!/bin/bash
i=1
while [ $i -le $# ] ; do
v=$(eval "echo \$$i")
echo "$i: $v"
i=$((i + 1))
done
Você pode usá-lo assim:
me@localhost] ./foo.sh a b c
1: a
2: b
3: c
Se eu definir a variável args
como um valor contendo um espaço (como "super nintendo"
), posso usar sem cotação para que o bash trate como dois argumentos:
me@localhost] args="super nintendo" ; ./foo.sh $args
1: super
2: nintendo
Ou eu posso usar quoting fraco (aspas duplas) para que o bash o trate como um único argumento, mas expandindo a variável para o valor real:
me@localhost] args="super nintendo" ; ./foo.sh "$args"
1: super nintendo
Ou eu posso usar strong-quoting (aspas simples) para tratá-lo literalmente como digitado:
me@localhost] args="super nintendo" ; ./foo.sh '$args'
1: $args
No entanto, a cotação fraca da variável especial $@
parece agir como se não houvesse cotação. Por exemplo, bar.sh
abaixo das chamadas foo.sh
duas vezes, uma vez com cotação fraca e uma vez sem cotação.
#!/bin/bash
./foo.sh "$@"
./foo.sh $@
Chamar isso com ./bar.sh a b c
produz saída idêntica para as duas chamadas para foo.sh
:
1: a
2: b
3: c
1: a
2: b
3: c
O que eu esperava ver era o seguinte:
1: a b c
1: a
2: b
3: c
O que eu estou perdendo citando no bash aqui?