No bash, qual é a maneira mais segura de passar variáveis para outro programa - $ * ou $ @? [duplicado]

8

Alguém pode me explicar de forma concisa qual é a diferença entre essas duas vars?

Qual é a maneira mais segura de passar variáveis para outro programa?

Por exemplo

#! /bin/bash

# do stuff

# pass variables onto another program
java $@
    
por Jonathan 18.03.2011 / 21:29

3 respostas

13

Usando este script:

#! /bin/sh
# Greg Wooledge's args script
printf "%d args:" $#
printf " <%s>" "$@"
echo

Experimente esta demonstração:

$ set -- a 'b     c' d
$ args $*
4 args: <a> <b> <c> <d>
$ args $@
4 args: <a> <b> <c> <d>
$ args "$*"
1 args: <a b     c d>
$ args "$@"
3 args: <a> <b     c> <d>

Você geralmente deve usar "$@" (com as aspas).

Às vezes, é útil alterar IFS e usar "$*" :

$ saveIFS=$IFS; IFS='|'; args "$*"; IFS=$saveIFS
1 args: <a|b     c|d>
    
por 18.03.2011 / 22:03
5

O mais seguro é "$@" porque passa o arglist sem expansão e separa cada argumento. Consulte o link para obter mais detalhes.

    
por 18.03.2011 / 21:37
5

Use: "$@" se você quiser representar os argumentos originais (incluindo nenhum argumento) com precisão.

Existem 5 notações para mencionar:

  • $@
  • $*
  • "$@"
  • "$*"
  • ${1+"$@"}

Os dois primeiros são equivalentes; ambos dividem as palavras na lista de argumentos e as transmitem ao comando que está sendo invocado. Eles raramente são a escolha correta.

Os dois segundos são radicalmente diferentes. A notação "$@" copia efetivamente os argumentos para o shell (ou os argumentos definidos por meio do comando set ) para o comando que está sendo chamado, preservando o número de argumentos, os espaços dentro deles e a divisão entre eles. Se houver zero argumentos, isso não gera nada.

A notação "$*" cola todos os argumentos em uma única string, colocando um espaço entre os argumentos, mas preservando os espaços dentro dos argumentos. É apropriado para uso em contextos como:

echo "You said, '$*'"

onde a máxima fidelidade à linha de comando original não é crucial.

A notação final, ${1+"$@"} , é uma ressaca de dias passados que você pode encontrar em scripts de shell antigos. Era uma vez (e há muito tempo - como 30 anos atrás), o shell Bourne tratou "$@" como um único argumento vazio quando não havia argumentos. Esse não é o comportamento há muito tempo, mas alguns scripts escritos há muito tempo ainda podem se proteger usando essa notação. A notação ${1+X} significa 'se $1 estiver definido como qualquer coisa, até mesmo uma cadeia vazia, em seguida, forneça o valor X . Na notação em discussão, o X é "$@" , que é uma lista de argumentos quando se sabe que há pelo menos um - e, de outro modo, nenhum argumento. O que significa o mesmo que "$@" em qualquer shell moderno.

    
por 19.03.2011 / 20:38

Tags