Во многих вопросах и руководствах по bash я вижу, что могу получить доступ к аргументам командной строки в сценариях bash двумя способами:
$ ~ >cat testargs.sh
#!/bin/bash
echo "you passed me" $*
echo "you passed me" $@
Что приводит к:
$ ~> bash testargs.sh arg1 arg2
you passed me arg1 arg2
you passed me arg1 arg2
В чем разница между $*
и $@
?
Когда следует использовать первое и когда использовать второе?
echo "something $@"
как ошибкуОтветы:
Разница появляется, когда указаны специальные параметры. Позвольте мне проиллюстрировать различия:
Еще один пример важности цитирования: обратите внимание, что между «arg» и числом есть 2 пробела, но если я не смогу процитировать $ word:
и в bash,
"$@"
это список "по умолчанию" для перебора:источник
$*
или"$*"
может потребоваться, и цель не может быть достигнута$@
или"$@"
?"$@"
с кавычками.Хорошая удобная обзорная таблица из Bash Hackers Wiki :
где
c
в третьем ряду находится первый символ$IFS
, Разделитель внутренних полей, переменная оболочки.Если аргументы должны храниться в переменной скрипта, а аргументы должны содержать пробелы, я искренне рекомендую использовать
"$*"
трюк с внутренним разделителем полей,$IFS
установленным на tab .источник
$IFS
расшифровывается как «Внутренний разделитель полей».$ *
$ @
Источник: Баш человек
источник
$ @ совпадает с $ *, но каждый параметр является строкой в кавычках, то есть параметры передаются без изменений, без интерпретации или расширения. Это означает, среди прочего, что каждый параметр в списке аргументов рассматривается как отдельное слово.
Конечно, "$ @" следует заключать в кавычки.
http://tldp.org/LDP/abs/html/internalvariables.html#ARGLIST
источник
Этот пример let может выделить разницу между «at» и «asterix», когда мы их используем. Я объявил два массива "фрукты" и "овощи"
Смотрите следующий результат, код выше:
источник