2013-03-17 2 views
0

В (ба) ш скрипт моего, у меня есть, например:Каков самый эстетичный способ избежать одиночной кавычки внутри одной кавычки в (ba) sh?

MYVAR='Alice says: "Hello, Bob." But Bob isn't listening.' 

Это ошибка синтаксиса, так как "в isn't заканчивает одинарные кавычки. Я знаю, что могу исправить это, используя

MYVAR='Alice says: "Hello, Bob." But Bob isn'"'"'t listening.' 

Но это так уродливо ... что я могу сделать вместо этого? ш не поддерживает

MYVAR='Alice says: "Hello, Bob." But Bob isn\'t listening.' 

Каких бы терпимые, и переход на строку двойных кавычек не вариант для меня.

ответ

3

Нет, вы не можете вставлять одну кавычку внутри одной кавычки в Bash (или оболочку korn). Это особенность выбранного вами языка. Внутри одинарных кавычек специальных символов нет, и это включает в себя \.

Это вариация на одном из ваших решений, и это некрасиво:

echo 'Alice says: "Hello, Bob." But Bob isn'\''t listening.' 

дает:

Alice says: "Hello, Bob." But Bob isn't listening. 

В качестве альтернативы использовать другой язык, как Perl или Python.

+1

@AnsgarWiechers: да, и ОП дал, что в вопрос как «sooo уродливый». – cdarke

+0

@cdarke: Вы, вечеринка, тщетно ... – einpoklum

+0

@cdarke Я не очень внимательно изучил вопрос. Извиняюсь. –

0

Вы также можете использовать двойные кавычки и экранирование. Я думаю, это проще, чем изменить язык:

MYVAR="Alice says: \"Hello, Bob.\" But Bob isn't listening." 

Больше информации о escaping symbols в Баш.

+0

«переход на строку с двумя кавычками для меня не вариант». Прости, я пропустил это. – idobr

2

Раствор не-POSIX, который поддерживается в ударе, по крайней мере, состоит в следующем:

MYVAR=$'Alice says: "Hello, Bob." But Bob isn\'t listening.' 

В $ причины избежать обработки.

+1

Обратите внимание, что это не гарантируется для работы во всех оболочках ('bash' и' zsh' поддерживают его и, возможно, некоторые другие. Однако стандарт POSIX этого не требует.) – chepner

+0

@chepner: Спасибо, исправлено. – einpoklum

0

Я не уверен, почему переход на $'...' является вариантом, но переход на двойные кавычки не является (предположительно для предотвращения какого-либо расширения параметров). Но вам не нужно двойные кавычки всю строку:

MYVAR='Alice says: "Hello, Bob." But Bob '"isn't"' listening.' 
1

Использование Heredoc хороший способ справиться с этим:

read MYVAR << \EOF 
Alice says: "Hello, Bob." But Bob isn't listening. 
EOF 
Смежные вопросы