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

В C# есть дословная строка, так что

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

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

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

test.sh

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

2 ответа

Решение

Для определения конкретной строки в вашем примере, Apparel & Accessories > Clothing > Activewear будут работать либо двойные, либо одинарные кавычки; Ссылка на это позже - другая история:

В оболочке (любой POSIX-совместимой оболочке) то, как вы ссылаетесь на переменную, так же важно, как и ее определение.

Чтобы безопасно ссылаться на ранее определенную переменную без побочных эффектов, заключите ее в двойные кавычки, например: "$directory" ,

Чтобы определить [переменную как] буквальную (дословную) строку:

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

  • Если ваша строка не содержит одинарных кавычек:

    • Используйте строку в одинарных кавычках, например:

      directory='Apparel & Accessories > Clothing > Activewear'
      

Строка в одинарных кавычках не подлежит интерпретации оболочкой, поэтому, как правило, это самый безопасный вариант для определения литерала. Обратите внимание, что строка может занимать несколько строк; например:

        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


Наконечник шляпы @chepner, который указывает, что POSIX-совместимый способ прямого включения одной кавычки в строку, которая будет использоваться дословно, заключается в использовании read -r с документом здесь, используя цитируемый начальный разделитель (-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 читает в этом случае). Следовательно, вы не можете использовать эту технику для прямой передачи результирующей строки в качестве аргумента.

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

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

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

Другие вопросы по тегам