Как отобразить `одиночные кавычки` при использовании одинарных кавычек для переноса специальных символов в оболочке?

26

Сегодня я читаю учебник по оболочке от http://www.tutorialspoint.com/unix/unix-quoting-mechanisms.htm

В котором упоминается:

Если в строке для вывода отображается одинарная кавычка, вы не должны помещать всю строку в одинарные кавычки, вместо этого вы должны были использовать обратную косую черту () следующим образом:

echo 'It\'s Shell Programming'

Я пробовал это на моем сервере Centos, он не работает, >подсказка подсказывает мне больше типа.

Мне было интересно, так как две одинарные кавычки превращают все специальные символы в обычные символы, которые включают управляющий символ \, но исключают себя ',
как мне представить одну одинарную кавычку 'в фразе, заключенной в одинарные кавычки?

Zen
источник
1
Почему бы не использовать echo It\'s Shell Programmingили echo "It's Shell Programming"?
Cuonglm
@cuonglm, потому что я могу использовать такую ​​фразу, какecho Wow, I'm going to have lots of $$$$$$ now
Zen
2
Таким образом, вы должны использовать двойные кавычки, и бежать $тоже. Что-то вроде echo Wow, I\'m going to have lots of \$\$\$\$\$\$ nowили простоecho Wow, I\'m going to have lots of '$$$$$$' now
cuonglm
@cuonglm, да, я могу это сделать, и я знаю, как я могу это сделать. Но учебник, который я читал, кажется, уверен в том, что есть способ избежать одиночной кавычки внутри фраз, заключенных в одинарные кавычки, но данный пример учебника не работает. Поэтому мне интересно, кто-то может знать решение.
Дзен
1
Как насчет этого? echo 'It'"'"'s Shell Programming', Я просто делю его на 3 строки, первая и последняя окружены одинарными кавычками, а средняя имеет одинарную кавычку в двойных кавычках.
jcbermu

Ответы:

49

Учебник не так.

POSIX говорит:

Одиночная кавычка не может встречаться в одинарных кавычках.

Вот несколько альтернатив:

echo $'It\'s Shell Programming'  # ksh, bash, and zsh only, does not expand variables
echo "It's Shell Programming"   # all shells, expands variables
echo 'It'\''s Shell Programming' # all shells, single quote is outside the quotes
echo 'It'"'"'s Shell Programming' # all shells, single quote is inside double quotes

Дальнейшее чтение: Цитаты - Грег Вики

Mikel
источник
4
Еще одно: echo 'It''s Shell Programming'- zsh с rc_quotesустановленным параметром (и оболочкой rc) - пара одинарных кавычек внутри одинарных кавычек представляет одну одинарную кавычку.
Михал Политовски
5
Я иногда использую q="'"и qq='"'чтобы сделать это чище. Это позволяет echo "It${q}s ${qq}Shell Programming${qq}"(фигурные скобки необходимы с учетом конечных букв). POSIX-безопасности. Внешний слой должен быть в двойных кавычках.
Адам Кац
1

Вы можете использовать:

sed "s/'"'/&\\&&/g
     s/.*/'"'&'"'/
' <<IN
$arbitrary_value
IN

Для безопасной оболочки заключить в кавычки строку значения на строку.

В зависимости от оболочки, вы также можете сделать:

printf %q\\n "$arbitrary_value"

Хотя я обычно предпочитаю делать:

a=$(alias "a=$arbitrary_value" a); a=${a#*=}

Более ручной подход может выглядеть так:

sq(){ set \' "$1"
      while case $2 in (*\'*) :;;
      (*) ! RETURN="$1$2'"     ;;esac
      do  set "$1${2%%\'*}'\''" "${2#*\'}"
      done
}

... который, по крайней мере, без вилки.

mikeserv
источник
1
Я совершенно не понимаю, о чем вы говорите, кроме фразы « printf %q\\n "$arbitrary_value"другие слишком сложны».
Дзен
1

В случае, если кто-то другой добавит в файл сочетание одинарных и двойных кавычек, это тоже работает:

cat > its-shell-programing.txt << __EOF__
echo $'It\'s Shell Programming'
echo "It's Shell Programming"
echo 'It'\''s Shell Programming'
echo 'It'"'"'s Shell Programming'
__EOF__

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

cat >> its-shell-programing.txt << __EOF__
echo \$It\'s Shell Programming
__EOF__
alexh
источник