Estou escrevendo um script bash onde preciso passar uma string contendo espaços para uma função no meu script bash.
Por exemplo:
#!/bin/bash
myFunction
{
echo $1
echo $2
echo $3
}
myFunction "firstString" "second string with spaces" "thirdString"
Quando executado, a saída que eu esperaria é:
firstString
second string with spaces
thirdString
No entanto, o que é realmente produzido é:
firstString
second
string
Existe uma maneira de passar uma seqüência de caracteres com espaços como argumento único para uma função no bash?
echo "$@"
oufor i in "$@"; do echo $i ; done
use parâmetros entre aspas corretamente que contenham espaços. É o que é claramente mencionado em toda abash
documentação dapositional parameters
seção.myFunction "$@"
Respostas:
você deve colocar aspas e também, sua declaração de função está errada.
E, como os outros, funciona para mim também. Diga-nos qual versão do shell você está usando.
fonte
$@
se comporta da mesma forma que sem aspas$*
- os resultados são divididos por sequência e depois expandidos individualmente; portanto, se você tiver guias, elas serão convertidas em espaços, se você tiver palavras que possam ser avaliadas como expressões globais. será, etc.Outra solução para o problema acima é definir cada string como uma variável, chamar a função com variáveis indicadas por um cifrão literal
\$
. Em seguida, na função useeval
para ler a variável e a saída conforme o esperado.A saída é então:
Ao tentar resolver um problema semelhante a esse, estava encontrando o problema do UNIX pensando que minhas variáveis eram delimitadas por espaço. Eu estava tentando passar uma string delimitada por canal para uma função usando
awk
para definir uma série de variáveis usadas posteriormente para criar um relatório. Inicialmente, tentei a solução postada por ghostdog74, mas não consegui fazê-la funcionar, pois nem todos os meus parâmetros estavam sendo passados entre aspas. Após adicionar aspas duplas a cada parâmetro, ele começou a funcionar conforme o esperado.Abaixo está o estado anterior do meu código e funcionando totalmente após o estado.
Antes - Código que não funciona
Código de funcionamento após
fonte
A solução mais simples para esse problema é que você só precisa usar
\"
argumentos separados por espaço ao executar um script de shell:fonte
Sua definição de myFunction está errada. Deveria ser:
ou:
Enfim, parece bom e funciona bem para mim no Bash 3.2.48.
fonte
Estou com 9 anos de atraso, mas uma maneira mais dinâmica seria
fonte
Solução simples que funcionou para mim - citado $ @
Eu pude verificar o comando grep real (graças ao conjunto -x).
fonte
Você pode ter uma extensão desse problema caso o texto inicial tenha sido definido em uma variável do tipo string, por exemplo:
Nesse caso, se você não passar a variável status_message para frente como string (cercada por ""), ela será dividida em uma montagem de argumentos diferentes.
"$ variable" : a faixa atual é CDE no DEF da ABC
variável $ : O
fonte
myFunction "firstString" "second string with spaces" "thirdString"
e não funcionou para ele. Portanto, o que você propõe não se aplica a essa pergunta.Tinha o mesmo tipo de problema e, de fato, o problema não era a função nem a chamada de função, mas o que eu passava como argumentos para a função.
A função foi chamada a partir do corpo do script - o 'main' -, então eu passei "st1 a b" "st2 c d" "st3 ef" da linha de comando e passei para a função usando myFunction $ *
O $ * causa o problema à medida que se expande para um conjunto de caracteres que serão interpretados na chamada para a função usando o espaço em branco como delimitador.
A solução foi alterar a chamada para a função no tratamento explícito de argumentos do 'main' para a função: a chamada seria então myFunction "$ 1" "$ 2" "$ 3", que preservará o espaço em branco nas cadeias, conforme as aspas delimitarão os argumentos ... Portanto, se um parâmetro pode conter espaços, ele deve ser tratado explicitamente em todas as chamadas de funções.
Como esse pode ser o motivo de longas pesquisas de problemas, pode ser aconselhável nunca usar $ * para passar argumentos ...
Espero que isso ajude alguém, algum dia, em algum lugar ...
fonte
"$@"
, nem todos citado"$1"
,"$2"
... paramters posicionais nem$*
.