У Zsh или bash есть кавычки, которые удобны для текста на английском языке?
Если я использую одинарные кавычки, слова с апострофами ( "не надо" ) раздражают:
'Don'"'"'t do that'
Если я использую двойные кавычки, знаки доллара и восклицательные знаки разворачивают его:
"It cost like \$1000\!"
Есть ли другой способ цитирования, который я могу использовать?
изменить. Я также должен добавить, что я хотел бы передать эту строку непосредственно в качестве аргумента командной строки, а не хранить ее в переменной. Для этого я попытался, используя решение DigitalRoss,
$ echo "$(cat << \EOF
Don't $worry be "happy".
EOF)"
но получите
dquote cmdsubst>
после нажатия введите:/. Итак, на данный момент ZyX-предложение setopt rcquotes
выглядит наиболее удобным.
Ответы
Ответ 1
С помощью zsh вы можете выполнять
setopt rcquotes
. Затем апострофы ASCII сбрасываются так:
echo 'Don''t'
. Или настройте свою раскладку, чтобы иметь возможность вводить апострофы UTF, у них нет проблем с какими-либо кавычками (в том числе и нет) в любой оболочке:
echo 'Don’t'
. Третий работает как для zsh, так и для bash:
echo $'Don\'t'
.
Ни первый, ни третий не могут сузить цитату одному символу, но они все еще менее подробные для недолговечных строк, а затем heredocs, предложенные выше. С помощью zsh вы можете сделать это, используя пользовательский виджет приемной линии, который заменит конструкты типа 'Don't'
на 'Don'\''t'
. Требуется довольно сложная магия регулярных выражений, которую я могу написать только в perl; и, вероятно, не самая лучшая идея, поскольку я не могу притворяться, что могу охватить все возможные случаи, прежде чем они ударят. В любом случае это не будет касаться каких-либо скриптов.
Ответ 2
Мне нравится направление Zsolt Botykai. Вот пример, который работает с любой оболочкой Posix. (Я также подтвердил, что он сохранил свою вставку в SO-сервер.)
$ read -r x << \EOF
Don't $worry be "happy".
EOF
$ echo $x
Don't $worry be "happy".
То, что делает эту работу,
-
-r
сделает \
не волшебным
-
\EOF
вместо EOF
делает $
не волшебным
Ответ 3
Если вы хотите назначить цитируемый текст переменной, вы все равно можете использовать heredocs, например (и также может быть многострочным текстом):
read -r -d '' VAR <<'ENDOFVAR'
This "will be" a 'really well' escaped text. Or won't.
ENDOFVAR