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

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

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

for file in "$workingdir"/*; do
  #do something with $file
done

if [[ $workingdir == $variable* ]]; then
  #do something
fi

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

Спасибо.

С уважением

2 ответа2

0

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

for file in "$workingdir"/*; do

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

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

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

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

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

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

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .