Есть ли в оболочке метод игнорирования 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'
использование объявления также является хорошей практикой при объявлении переменной.