Як відлунювати "єдину цитату", коли за допомогою однієї цитати загортати спеціальні символи в оболонку?


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
Дзен

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 теж) - пара одиничних лапок всередині одинарних лапок являє собою одну єдину цитату.
Michał Politowski

5
Я іноді використовую q="'"та qq='"'роблю це чистіше. Потім це дозволяє echo "It${q}s ${qq}Shell Programming${qq}"(фігурні дужки потрібні з поданими проміжними літерами). POSIX-безпечно. Зовнішній шар повинен бути подвійним.
Адам Кац

1

Ви можете використовувати:

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

Для безпечної оболонки вкажіть рядок значення на рядок.

Shell залежно, ви також можете зробити:

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.