что означает $ * в shell

Что означает $* в оболочке?

У меня есть две функции кода: run_command и run_test , они вызываются так:

 if [ -n "`echo ${GOAT_COMMANDS} | grep $1`" ]; then run_command $* else run_test $* fi 

Я хочу понять, что означает $* , но поиск Google очень плохо для поиска подобных вещей.

$* – это все параметры сценария или функции, разделенные на отдельные аргументы в пробеле.

Если у вас есть функция:

 foo() { for x in $* do echo $x done } 

затем выйдет foo 1 "2 3 4" 5 :

 1 2 3 4 5 

То есть цитированная строка "2 3 4" будет разделена на три отдельных слова.

Если вы не хотите разделить аргументы на отдельные слова, вы можете использовать $@ . Если одна и та же функция использовала "$@" вместо $* , она выводила бы:

 1 2 3 4 5 

То есть, цитированная строка не будет разделена на отдельные слова. Это похоже на перечисление всех позиционных параметров явно: "$1" "$2" "$3" "$4" ... В общем, это, вероятно, тот, который вы хотите использовать – расщепление слов часто приводит к неприятным ошибкам, которые трудно отследить.

На верхнем уровне скрипта (не внутри функции) они относятся к аргументам, предоставленным самому скрипту.

В вашем примере вызывается либо run_command либо run_test со всеми аргументами этого скрипта или функции, разделенными на отдельные слова. Если скрипт был запущен как script.sh "hello world" 2 3 то он мог бы работать:

 run_command hello world 2 3 

$* означает все позиционные параметры .

$* – это список позиционных параметров, но с разбиением слов. Например, на

 your_script ab "cd ef" 

$* даст вам 3 аргумента: ab , cd и ef . Использование "$@" намного безопаснее (если вы не хотите разбиения слов).

$* означает передать все параметры функции как один «параметр». Также рекомендуется иметь двойные кавычки вокруг такой переменной "$*" .

Некоторые документы на этом разделе 3.2.5

С другой стороны, если вам нужно выполнить итерацию по каждому из параметров, содержащихся в списке аргументов, используйте вместо этого $@ , как в этом примере:

 for var in "$@" do echo "$var" done 

Вот еще один пример: foo.sh

 #!/bin/bash foo1() { for x in "$@" do echo "f1: $x" done } foo2() { for x in "$*" do echo "f2: $x" done } foo1 1 2 "3 4 5" 6 7 echo foo2 1 2 "3 4 5" 6 7 

выход :

 $ ./foo.sh f1: 1 f1: 2 f1: 3 4 5 f1: 6 f1: 7 f2: 1 2 3 4 5 6 7