Espalhe o argumento bash pelo espaço em branco

0

No meu script, "$ 1" é uma string de tokens, separados por espaços em branco.

como eu posso "espalhar" este único argumento em múltiplos argumentos para passar para outro programa, por exemplo

./my-script2 ...$1  # spread the string into multiple arguments, delineating by whitepace

Espero que você entenda a pergunta, tenha problemas para procurar respostas para isso.

Eu tentei isso:

./my-script2 <<< "$1"

e isso:

./my-script2 "" <<< $1

e outras combinações, mas isso não parece funcionar. Eu preciso dar suporte ao Bash v3 e acima.

    
por Alexander Mills 15.07.2017 / 04:02

2 respostas

1
./my-script2 $1
parâmetros estão sujeitos a quebra de palavras quando expandido :

The shell scans the results of parameter expansion, command substitution, and arithmetic expansion that did not occur within double quotes for word splitting.

Este é o comportamento POSIX especificado , embora alguns shells (notavelmente zsh) desativem por padrão. Se você alterou o valor de IFS do padrão, está em você.

    
por 15.07.2017 / 04:44
1

Resumo: Uma solução segura de "expansão de nome de arquivo" (para my-script2):

IFS=' ' read -a arr <<<"$1"
printf '<%s>--' "${arr[@]}" ; echo

A solução ingênua de usar a variável não cotada para dividi-la em palavras (com base no valor IFS) também expõe o conteúdo à expansão de nome de arquivo em *,? e [(pelo menos).

Esta string específica funciona corretamente:

$ set "a string with spaces"
$ printf '<%s>--' $1; echo
<a>--<string>--<with>--<spaces>--

Mas esta string falha claramente:

$ set "a bad * string with spaces"
$ printf '<%s>--' $1; echo
<a>--<bad>--<file1>--<file2>--<string>--<with>--<spaces>--

O asterisco foi expandido para os arquivos em PWD.

Here-doc

Uma maneira (muitas vezes negligenciada, mas também muito útil) de obter expansão de variáveis sem "expansão de nome de caminho" é usar um documento aqui.

IFS=' ' read -ra arr <<-_EOF_
 $1
 _EOF_
 printf '<%s>--' "${arr[@]}" ; echo;

Como explicado no manual:

If word is unquoted, all lines of the here-document are subjected to parameter expansion, command substitution, and arithmetic expansion, … …

Por favor, note que "expansão do nome do caminho" não é aplicada .

A prima de um documento aqui é a string here, que torna o código mais curto:

IFS=' ' read -ra arr <<<"$1"
printf '<%s>--' "${arr[@]}" ; echo;

Lembre-se que (como entre aspas duplas) os caracteres \, $ e 'são especiais.
Do manual:

the character sequence \ is ignored, and \ must be used to quote the characters \, $, and '

    
por 15.07.2017 / 21:10