Вы могли попробоватьmkdir -p project/{'level 1','level 2'}
BK_STATARGS
переменная, содержание которой является 7 символьными строками -f '%z'
. Во-первых, давайте посмотрим то, что происходит в команде
stat "${BK_STATARGS}" test.txt
Оболочка сначала анализирует команду в синтаксическое дерево, которое здесь состоит из единственной простой команды, с тремя маркерами: stat
, результат расширения ${BK_STATARGS}
, и test.txt
. Затем оболочка разворачивает значение переменной для определения второго слова, которое является -f '%z'
(та же самая 7 символьных строк). Наконец оболочка выполняет команду в первом слове, передавая последующие слова как параметры командной строки, таким образом, stat
выполняется с двумя аргументами -f '%z'
и test.txt
.
Давайте теперь обратимся к более сложной команде
stat ${BK_STATARGS} test.txt
Обработка является тем же до расширения значения переменной. Так как подстановка переменных не находится в двойных кавычках, ее значение рассматривают как разделенный от пробела список слов. В строке существует один пробельный символ, таким образом, это разделяется на два слова, и stat
получает три аргумента: -f
, '%z'
и test.txt
.
Одинарные кавычки являются частью синтаксиса оболочки: они распознаны на этапе парсинга. У них нет особого значения, когда они находятся в строке, даже если строка разделяется после переменного расширения.
С тех пор %
и z
не специальные символы, Вы не должны заключать им в кавычки:
typeset -r BK_STATARGS="-f %z"
typeset FILE_SIZE2=$(stat ${BK_STATARGS} test.txt)
В целом, для передачи нескольких аргументов команде необходимо использовать массив вместо строки.
typeset -a BK_STATARGS; BK_STATARGS=(-f '%z')
typeset FILE_SIZE2=$(stat "${BK_STATARGS[@]}" test.txt)
"${BK_STATARGS[@]}"
синтаксис должен развернуть массив в свой список элементов. Даже при том, что это похоже на отдельное слово из-за двойных кавычек, это на самом деле разделяется на несколько слов из-за [@]
нижний индекс, работая как "$@
.