Почему расширение переменной удара сохраняет кавычки?

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

> wordlist.txt

Это говорит оболочке усекать файл к 0 длинам, не порождая другой процесс.

12
12.05.2012, 02:26
3 ответа

Дополнительная пара кавычек была бы использована только дополнительным шагом оценки. Например, вызванный eval:

bash-4.2$ VAR='echo "hi"'

bash-4.2$ $VAR
"hi"

bash-4.2$ eval $VAR
hi

Но обычно плохая идея поместить команды с параметрами в одной строке. Используйте массив вместо этого:

bash-4.2$ VAR=(echo "hi")

bash-4.2$ "${VAR[@]}"
hi
16
27.01.2020, 19:54
  • 1
    Также важно отметить, что кавычки оценены по-другому; двойные кавычки (") позволяют оценку вложенной строки, одинарные кавычки (') печатают строку как литерал. Пример: "$(ls)" и '$(ls)'. Это - причина, почему кавычки появляются в исходных примерах вопросов. –  Joseph Kern 12.05.2012, 20:00
  • 2
    Массив является также источником проблем. Код принадлежит функциям, данным к переменным. Пример Вы данные работы только потому, что кавычки удалены в разделении массива. A printf '<%s> ' "${VAR[@]}" покажет, что кавычки уже были удалены. Если Вы устанавливаете VAR как VAR=(echo \"hi\") чтобы на самом деле иметь кавычки, та же проблема появляется снова, $ ${VAR[@]} распечатает "hi" –   17.01.2016, 08:10

Удаление кавычки только происходит на исходных входных словах, не на результате расширений. Кавычки, которые являются частью расширенных переменных, являются нетронутыми.

9
27.01.2020, 19:54

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

Точка кавычек в оболочке Unix/Linux/BSD должна сохранить части строки вместе, которая иначе проанализировать как несколько строк. Так как по умолчанию пробел использования оболочки как маркерный разделитель, строка с пробелами (как "один два три"), если бы не заключенный в кавычки или завершенный так или иначе, проанализировать как 3 строки: "один", "два" и "три".

Если программист хочет строку со значением некоторой интерполированной переменной:

VAR=two
STRING="one $VAR three"

оболочка не должна абсолютно удалять кавычки: строка, содержащая пробелы, проанализировать как 3 меньших строки.

2
27.01.2020, 19:54

Теги

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