Eu tenho a seguinte função:
bar() { echo $1:$2; }
Estou chamando essa função de outra função foo
,. foo
próprio é chamado da seguinte maneira:
foo "This is" a test
Eu quero obter a seguinte saída:
This is:a
Ou seja, os argumentos que bar
recebem devem ser os mesmos tokens que eu transmito foo
.
Como foo
precisa ser implementado para conseguir isso? Eu tentei as duas implementações a seguir, mas nenhuma delas funciona:
foo() { bar $*; }
- resultado:
this:is
foo() { bar "$*"; }
- resultado:
this is a test:
Minha pergunta é efetivamente como posso preservar a citação de argumentos. Isso é possível em tudo?
Respostas:
Use
"$@"
:"$@"
e"$*"
tem significados especiais:"$@"
expande para várias palavras sem realizar expansões para as palavras (como"$1" "$2" ...
)."$*"
une parâmetros posicionais com o primeiro caractere no IFS (ou espaço se o IFS estiver desativado ou nada se o IFS estiver vazio).fonte
$*
tinha essa semântica - agora é lógico. Eu acho que esta resposta realmente resolve outro problema que eu tenho tido quando iteração sobre matrizes ...Você deve usar
$@
, em vez de$*
saída
Por que isso funciona?
Como com
$*
, todo parâmetro é visto como uma única palavra , significa que você passaráThis is a test
para abar
função. Nesse caso, o 1º parâmetro passa para a barra de funções éThis
2ºis
.Com
$@
, cada parâmetro é uma string entre aspas , significa que você passará'This is'
'a'
'test'
para abar
função. Portanto, o 1º parâmetro passa para a barra de funções é oThis is
2º éa
.fonte