Есть ли различие между двойным заключением в кавычки переменной или целой строки в эхе

Нет никакой проблемы, объявляя функцию, содержащую неизвестные команды. Это - только когда Вы пытаетесь выполнить его, проблема происходит.

$ unknown() { foo; bar; baz; }
$ unknown
bash: foo: command not found
bash: bar: command not found
bash: baz: command not found
3
10.01.2015, 00:38
1 ответ

В

echo Variable "$var" is not initialised.

вы передаете 5 аргументов в echo (6, если вы считаете echo ), echo выводит их, разделенные пробелом. заканчивается новой строкой.

In:

echo "Variable $var is not initialised."

Вы передаете 2 аргумента, из которых первый уже имеет echo .

В данном конкретном случае и в большинстве случаев это будет функционально эквивалентно.

Второе означает, что оболочке меньше работы по синтаксическому анализу команды и сохранению ее в аргументы перед запуском echo и меньше работы для echo , чтобы просмотреть свои аргументы.

Вряд ли это будет иметь большое значение. В своих тестах я заметил, что это немного отличается от некоторых комбинаций echo / оболочки , таких как bash с его встроенными функциями, но почти не влияет на другие.

Другие причины, по которым вы можете передать один аргумент вместо нескольких:

  • Если вы хотите, чтобы между аргументами было больше пробела: echo ab выведет ab , вы необходимо echo 'a b' для вывода ab .
  • В таких вещах, как echo «$ opt» является недопустимым параметром , с некоторыми реализациями echo , такими как echo , встроенная в bash , это не будет работать с opt = -e (или -E или -neE ...), а echo "$ opt - неверный вариант " будет в порядке.
  • В echo foo bar вы передаете 2 аргумента по 3 байта каждый, то есть 2 указателя (8 байтов каждый в 64-битных системах) и 6 байтов (всего 22 байта в 64-битных системах). Пока это один указатель и 7 байтов для echo 'foo bar' (всего 15 байтов). При вызове внешнего исполняемого файла echo с большим списком аргументов это может заставить вас быстрее достичь предела размера аргументов (хотя многие системы также имеют ограничение на максимальный размер одного аргумента) .

В любом случае здесь, для произвольных данных (таких как $ var , содержание которых мы не знаем (хотя из контекста здесь мы могли бы вывести, что он содержит только alnums и подчеркивание)), вы хотите чтобы использовать printf , а не echo :

printf '%s\n' "Variable $var is not initialised."

Или:

printf 'Variable %s is not initialised.' "$var"

И в этом случае, помимо формата, в printf .

1
27.01.2020, 21:31

Теги

Похожие вопросы