Есть ли разница между $@ и "$@"?

Есть ли разница между $@ а также "$@"?

Я понимаю, что могут быть различия для не специальных символов, но как насчет @ подписать с входными аргументами?

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'
Другие вопросы по тегам