Linux: переменные в двойных кавычках и для файлового цикла

313
lennelei

В другом вопросе мне посоветовали использовать двойные кавычки в моем сценарии, чтобы избежать ошибок.

Прочитав много информации о двойных кавычках, я предполагаю, что могу / должен исключать подстановочные знаки из двойных кавычек, когда мне нужно (например) циклически перебирать файлы, но я хотел бы быть уверен.

Не могли бы вы сказать мне, если оба использования ниже являются правильным использованием двойных кавычек?

for file in "$workingdir"/*; do #do something with $file done  if [[ $workingdir == $variable* ]]; then #do something fi 

Для того, что я видел в своих тестах, использование "$workingdir/*"будет устанавливать переменную, fileс $workingdir/*которой я не хочу.

Спасибо.

С уважением

0
Есть ли примеры того, что должно произойти против того, что на самом деле происходит, для данных файлов? Xen2050 5 лет назад 0
На самом деле, то, что происходит, это то, что я хочу: у меня нет проблем с кодом. Я хотел бы быть уверен, что это правильный способ сделать это, так как я все еще не очень знаком с использованием двойных кавычек вокруг переменных. lennelei 5 лет назад 0
Что ж, попробуйте использовать переменную (имя файла здесь?) С пробелами и символами новой строки, а затем посмотрите, что произойдет, цитирование обычно позволяет избежать подобных проблем. Могу хотеть цитировать внутри [[/ test тоже Xen2050 5 лет назад 0

2 ответа на вопрос

0
xenoid

Расширение имени файла выполняется после разбиения по словам (о чем говорят двойные кавычки ...).

Таким образом, "$mydir"/*расширяется до "my directory"/*после подстановки переменной, затем до my directory/*(как одно слово) после разбиения слова, а затем до my directory/file1, my directory/file2после раскрытия имени файла.

0
Gordon Davisson

Первый пример, который вы привели, верен (если он подразумевает очевидную вещь):

for file in "$workingdir"/*; do 

Это перебирает список файлов в каталоге, соответствующих значению переменной workingdir, и работает, даже если он содержит пробелы или другие забавные символы.

Однако второй пример более сложный:

if [[ $workingdir == $variable* ]]; then 

В этом случае значение переменной variableбудет считаться шаблоном, а не фиксированной строкой. Например, если variableбыло установлено «* foo», общее условие будет совпадать, если в $workingdirлюбом его значении содержится «foo». Если вы хотите, $variableчтобы с ним обращались как с литеральной строкой, а не с шаблоном, вам снова пришлось бы поместить ее в двойные кавычки (но не в том случае *, если вы хотите , чтобы это обрабатывалось как подстановочный знак):

if [[ $workingdir == "$variable"* ]]; then 

... и, честно говоря, отслеживание того, где двойные кавычки имеют значение, а где нет, - больше проблем, чем стоит. (то есть безопасно оставлять их слева =или ==внутри, [[ ]]но не справа или внутри [ ]). Поэтому я просто рекомендую везде заключать их в двойные кавычки, чтобы вам не приходилось следить за этим:

if [[ "$workingdir" == "$variable"* ]]; then 

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