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


26

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

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

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

echo 'It\'s Shell Programming'

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

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


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

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


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
}

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


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__
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.