Есть ли метод в оболочке игнорировать escape-символы?

В С# существует текстовая строка, так что

string c = "hello \t world";               // hello     world
string d = @"hello \t world";              // hello \t world

Я новичок в shell script, есть ли подобный метод в оболочке?

Поскольку у меня есть много папок с именем "Одежда и аксессуары > Одеждa > Activewear", я хочу знать, есть ли простой способ обработать escape-символы без записи так много.

test.sh

director="Apparel & Accessories > Clothing > Activewear"
# any action to escape spaces, &, >   ???
hadoop fs -ls $director

Ответ 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). Поэтому вы не можете использовать этот метод, чтобы напрямую передать полученную строку в качестве аргумента.

Ответ 2

используйте сильные цитаты, т.е. 'string', позволяя escape char или специальный char для строки.

e.g. declare director='Apparel & Accessories > Clothing > Activewear'

также использование declare является хорошей практикой при объявлении переменной.