Divisão de parâmetros

2

Eu tenho um script bash que é um simples wrapper em torno de outro processo:

$ cat ~/bin/s3cmd
#!/bin/sh
trickle -u 80 ~/bin/s3cmd.py $*
$

Isso funciona muito bem quando os parâmetros não contêm espaços. No entanto, parece falhar sempre que os parâmetros passados para o script s3cmd externo contiverem espaços, mesmo se esses forem escapados na linha de comando.

Como faço prova de espaço em branco, de modo que cada parâmetro seja transmitido corretamente para s3cmd.py ?

    
por a CVn 13.11.2012 / 21:50

2 respostas

6

Use "$@" .

#!/bin/sh
trickle -u 80 ~/bin/s3cmd.py "$@"

Não há diferença funcional entre $* e $@ quando se está passando por uma divisão implícita de palavras (quase sempre quando não é citada). Quando citado, no entanto, $* é uma única string separada pelo primeiro caractere de IFS e "$@" é uma matriz real (o que você deseja).

$ set foo bar baz
$ IFS=c
$ printf '%s\n' "$@"
foo
bar
baz
$ printf '%s\n' "$*"
foocbarcbaz
    
por 13.11.2012 / 21:52
4

Você desejará usar $ @ em vez de $ * e citá-lo:

trickle -u 80 ~/bin/s3cmd.py "$@"

Veja também a seção Special Parameters na página do bash manpage.

    
por 13.11.2012 / 21:53