Estou tentando obter parâmetros citados de um script bash para serem recebidos com segurança por um script aninhado. Alguma ideia?
test.sh
#!/bin/bash
echo $*
bash myecho.sh $*
myecho.sh
#!/bin/bash
echo $1
echo $2
echo $3
echo $4
Amostra:
bash test.sh aaa bbb '"ccc ddd"'
Resultado:
aaa bbb "ccc ddd"
aaa
bbb
"ccc
ddd"
Resultado desejado
aaa bbb "ccc ddd"
aaa
bbb
ccc ddd
Respostas:
Observe que a construção "$ @" não é específica do bash e deve funcionar com qualquer shell POSIX (pelo menos funciona com traço). Observe também que, dada a saída desejada, você não precisa do nível extra de citação. IE, basta chamar o script acima como:
fonte
$@
não está disponível dentro de uma função (porque é sobrescrito por argumentos de função). Eu tenteifoovar="$@"
efoovar=$@
+"$foovar"
na função e nenhuma funcionou: - /Você deseja usar "$ @" (dólar entre aspas) para passar parâmetros para um subscrito. Igual a ....
ls-color.sh:
Quanto ao porquê ...
Na página de manual do Bash :
Configurando alguns scripts de demonstração ...
"$@"
- quoted-dollar-at é uma transformação de identidade para repassar args para um subshell (~ 99% do tempo, isso é o que você pretendia fazer):"$*"
- a estrela de um dólar entre aspas esmaga os argumentos em uma única string (~ 1% do tempo em que você realmente deseja esse comportamento, por exemplo, em um condicionalif [[ -z "$*" ]]; then ...
:):$*
/$@
- sem aspas, ambas as formas retiram um nível de aspas e interpretam os espaços das strings subjacentes, mas ignoram os caracteres de aspas (quase sempre, isso é um erro):Se você quiser se divertir, pode usar "$ @" para aninhar as coisas tão profundamente quanto desejar, empurrando e removendo elementos da pilha de args se quiser.
fonte