Нет никакой проблемы, объявляя функцию, содержащую неизвестные команды. Это - только когда Вы пытаетесь выполнить его, проблема происходит.
$ unknown() { foo; bar; baz; }
$ unknown
bash: foo: command not found
bash: bar: command not found
bash: baz: command not found
В
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
.