Есть ли разница между $@ и "$@"?
Есть ли разница между $@
а также "$@"
?
Я понимаю, что могут быть различия для не специальных символов, но как насчет @
подписать с входными аргументами?
2 ответа
Да!
$ cat a.sh
echo "$@"
echo $@
Давайте запустим это:
$ ./a.sh 2 "3 4" 5
2 3 4 5 # output for "$@"
2 3 4 5 # output for $@ -> spaces are lost!
Как видите, используя $@
заставляет параметры "терять" некоторый контент при использовании в качестве параметра. Смотрите, например, я только что назначил переменную, но echo $variable показывает что-то еще для подробного объяснения этого.
Из руководства GNU Bash -> 3.4.2 Специальные параметры:
@
($@) Расширяется до позиционных параметров, начиная с единицы. Когда раскрытие происходит в двойных кавычках, каждый параметр раскрывается в отдельное слово. То есть "$@" эквивалентно "$1", "$2" …. Если расширение в двойных кавычках происходит внутри слова, расширение первого параметра объединяется с начальной частью исходного слова, а расширение последнего параметра объединяется с последней частью исходного слова. Когда нет позиционных параметров, "$@" и $@ расширяются до нуля (то есть они удаляются).
Передача $@ в команду передает все аргументы в команду. Если аргумент содержит пробел, команда увидит этот аргумент как два отдельных.
Передача "$@" команде передает все аргументы в виде строк в кавычках. Команда увидит аргумент, содержащий пробелы, как один аргумент, содержащий пробелы.
Чтобы легко визуализировать разницу, напишите функцию, которая печатает все свои аргументы в цикле, по одному:
#!/bin/bash
loop_print() {
while [[ $# -gt 0 ]]; do
echo "argument: '$1'"
shift
done
}
echo "#### testing with \$@ ####"
loop_print $@
echo "#### testing with \"\$@\" ####"
loop_print "$@"
Вызов этого скрипта с
<script> "foo bar"
будет производить вывод
#### testing with $@ ####
argument: 'foo'
argument: 'bar'
#### testing with "$@" ####
argument: 'foo bar'