Ответ 1
Для определения конкретной строки в вашем примере Apparel & Accessories > Clothing > Activewear
будут работать либо двойные кавычки, либо одинарные кавычки; ссылаясь на это позже, это другая история:
В оболочке (любой POSIX-совместимой оболочке), как вы относитесь к переменной, так же важно, как и ее определение.
Чтобы безопасно ссылаться на ранее определенную переменную без побочных эффектов, заключите ее в двойные кавычки, например, "$directory"
.
Чтобы определить [переменную как] строку литерала (verbatim):
(В отличие от этого, чтобы определить переменную со встроенными ссылками переменных или встроенными подстановками команд или встроенными арифметическими выражениями, используйте двойные кавычки ("
).)
-
Если ваша строка содержит НЕТ одинарных кавычек:
-
Используйте строку с кавычками, например:
directory='Apparel & Accessories > Clothing > Activewear'
-
A строка с одной кавычкой не подлежит интерпретации оболочкой, поэтому она обычно является самым безопасным вариантом для определения литерала. Обратите внимание, что строка может охватывать несколько строк; например:.
multiline='line 1
line 2'
-
Если ваша строка содержит одиночные кавычки (например,
I'm here.
), и вы хотите, чтобы решение работало во всех POSIX-совместимых оболочках:- Разбить строку на несколько (однокасканные) части и сращивание в символах с одной кавычкой:
Примечание. К сожалению, одиночные кавычки не могут содержать одинарные кавычки, даже с экранированием.
directory='I'\''m here.'
Строка разбивается на однокасканный I
, за которым следует буква '
(экранированная как некотируемая строка как \'
), за которой следует однокасканный m here.
. В силу отсутствия пробелов между частями результат представляет собой одну строку, содержащую буквальную одиночную кавычку после I
.
Альтернатива: если вы не возражаете использовать многострочный оператор, вы можете использовать цитируемый здесь документ, как описано ниже.
-
Если ваша строка содержит одиночные кавычки (например,
I'm here.
), и вы хотите, чтобы решение работало вbash
,ksh
иzsh
-
Используйте цитирование ANSI-C:
directory=$'I\'m here.'
-
Примечание. Как вы можете видеть, цитирование ANSI-C позволяет экранировать одиночные кавычки как \'
, но обратите внимание на дополнительные последствия: другие последовательности \<char>
подвержены интерпретации, тоже; например, \n
интерпретируется как символ новой строки - см. http://www.gnu.org/software/bash/manual/bash.html#ANSI_002dC-Quoting
Совет шляпы @chepner, который указывает, что POSIX-совместимый способ прямого включения одной кавычки в строку, которая будет использоваться дословно, заключается в использовании read -r
с a здесь документ с использованием ограничителя прокрутки (опция -r
гарантирует, что символы \
в строке обрабатываются как литералы).
# *Any* form of quoting, not just single quotes, on the opening EOF will work.
# Note that $HOME will by design NOT be expanded.
# (If you didn't quote the opening EOF, it would.)
read -r directory <<'EOF'
I'm here at $HOME
EOF
- Обратите внимание, что здесь документы создают вход stdin (который в этом случае читает
read
). Поэтому вы не можете использовать этот метод, чтобы напрямую передать полученную строку в качестве аргумента.