Я хотел бы сохранить все аргументы командной строки для сценария Bash в одной переменной

Допустим, у меня есть сценарий Bash с именем foo.sh.

Я хотел бы назвать это так:

foo.sh Here is a bunch of stuff on the command-line

И я бы хотел, чтобы весь этот текст был сохранен в одной переменной и распечатан.

Таким образом, мой вывод будет:

Here is a bunch of stuff on the command-line

Как бы я это сделал?

Ответ 1

echo "$*"

будет делать то, что вы хотите, а именно распечатать все аргументы командной строки, разделенные пробелом (или, технически, независимо от значения $IFS). Если вы хотите сохранить его в переменной, вы можете сделать

thevar="$*"

Если это не отвечает на ваш вопрос достаточно хорошо, я не уверен, что еще сказать...

Ответ 2

Если вы хотите избежать использования $IFS, используйте [email protected](или не вставляйте $* в кавычки)

$ cat atsplat
IFS="_"
echo "     at: [email protected]"
echo "  splat: $*"
echo "noquote: "$*

$ ./atsplat this is a test
     at: this is a test
  splat: this_is_a_test
noquote: this is a test

Поведение IFS также следует за назначениями переменных.

$ cat atsplat2
IFS="_"
[email protected]
splatvar=$*
echo "     at: $atvar"
echo "  splat: $splatvar"
echo "noquote: "$splatvar

$ ./atsplat2 this is a test
     at: this is a test
  splat: this_is_a_test
noquote: this is a test

Обратите внимание, что если присвоение $IFS было сделано после назначения $splatvar, то все выходы были бы одинаковыми ($ IFS не повлияет на пример atsplat2).