Проблематичные цитаты

Вы могли попробоватьmkdir -p project/{'level 1','level 2'}

1
11.01.2014, 01:42
1 ответ

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[@]}" синтаксис должен развернуть массив в свой список элементов. Даже при том, что это похоже на отдельное слово из-за двойных кавычек, это на самом деле разделяется на несколько слов из-за [@] нижний индекс, работая как "$@.

0
28.01.2020, 02:00

Теги

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