Це дуже залежить від оболонки. Перегляньте посібник з оболонкою на деталі.
Також зауважте, що деякі персонажі є особливими лише в деяких контекстах. Наприклад, у більшості оболонок, *
і ?
вони є лише спеціальними у контекстах списку, в POSIX або csh-подібних оболонках, ~
є особливим лише на початку слова або слідом за деякими символами на зразок :
. Те саме для =
в zsh
. У деяких оболонках [
є спеціальним лише тоді, коли він відповідає (з деякими обмеженнями) a ]
.
У деяких оболонках, як-от bash
або yash
, спеціальні символи, як розмежувачі пустих маркерів, також різняться залежно від місцевості.
Оператори цитування (для видалення спеціального значення цих символів) також сильно різняться між оболонками.
Оболонки, подібні до Борна
Короткий огляд оболонок, подібних до Борна (тобто оболонок, які, як відомо, називались sh
у тій чи іншій системі з 80-х років):
Оболонка Борна
Спеціальні символи:
"\'&|;()^`<>$
, пробіл, новий рядок та вкладка є спеціальними у простих командних рядках, коли вони не цитуються.
#
( За винятком ранньої версії) є особливим на початку рядка або після пропуску, табуляції або некотируваних &|()^<>;`
.
{
і }
особливі лише тим, що вони є ключовими словами оболонки (тому лише слова в командному положенні).
*?[
є спеціальними як глобальні оператори, тому лише в контекстах списку. У випадку з [
тим, [...]
що це глобальний оператор, [
або його ]
потрібно лише цитувати, щоб усунути особливе значення.
=
є особливим у контекстах, де він розглядається як оператор присвоєння. Тобто, у простій команді для всіх слів, які не слідують за аргументом (крім після set -k
).
Цитуючи операторів
\
цитує всіх спеціальних символів, окрім нового рядка ( \<newline>
це спосіб продовжити довгий логічний рядок на наступний фізичний рядок, щоб ця послідовність була видалена). Зауважте, що backticks додає додаткової складності, як і всередині них, \
використовується спочатку, щоб уникнути закриття backtick та допомогти парсеру. Всередині подвійні лапки \
можуть використовуватися лише для виходу із себе "
, $
і `
( \<newline>
все ще є продовженням рядка). Всередині документа-документа тут, за винятком "
. \
це єдиний спосіб уникнути символів, що знаходяться тут.
"..."
подвійні лапки уникають усіх символів, крім себе \
, $
та `
.
'...'
Одиночні цитати уникають усіх персонажів, крім самого себе.
Оболонки POSIX
Оболонки POSIX поводяться переважно як оболонка Борна, за винятком того, що:
ksh
як POSIX за винятком того, що:
{string}
є особливим, якщо рядок містить без котирування ,
(або ..
в деяких випадках і з деякими версіями).
- ksh93 має додаткового спеціального оператора цитування:
$'...'
зі складними правилами. Цей оператор також знайдений (з деякими варіаціями) в bash
, zsh
, mksh
та FreeBSD і BusyBox sh
.
ksh93
також є $"..."
оператор котирування, який працює як, "..."
за винятком того, що рядок підлягає локалізації (може бути налаштований так, що вона перекладається на мову користувача). mksh
ігнорує $
в $"..."
.
bash
як, ksh93
але:
- в однобайтових локальних символах усі порожні (відповідно до локалі) символи розглядаються як роздільники (наприклад, пробіл чи вкладка). Насправді це означає, що ви повинні навести всі байти з 8-го бітового набору, якщо вони можуть бути порожнім символом у якомусь локалі.
- Коли розширення історії csh увімкнено, як у інтерактивних екземплярах,
!
у деяких контекстах особливе, а подвійні цитати не завжди уникають цього. І ^
є особливим на початку команди.
zsh
як, ksh93
але:
- та ж примітка, що і
bash
для розширення історії csh
=
особливий як перший символ слова ( =ls
розширюється на /bin/ls
).
{
а }
також може відкривати та закривати командні групи, коли їх не розмежовують (як у {echo text}
роботах на зразок Борна { echo text;}
).
- за винятком
[
поодинки, [
потреби, які цитуються, навіть якщо вони не закриті ]
.
- З
extendedglob
увімкненою опцією #
, ^
та ~
є глобальні оператори.
- З
braceccl
варіантом, {non-empty-string}
особливим.
$"..."
не підтримується.
- як особлива химерність,
?
не є особливою, якщо слідувати за %
(навіть цитованим або розширеним) на початку слова (щоб дозволити %?name
завдання завдання)
rcquotes
варіант (не включена за замовчуванням) дозволяє ввести одиничні лапки як ''
всередині одиночних лапок а ля rc
(див . нижче)
yash
як, POSIX
крім цього.
- всі порожні символи розглядаються як роздільники.
- За допомогою цього
brace-expand
варіанту реалізується розширення брекетів у стилі zsh.
Для всіх оболонок існують деякі спеціальні контексти, де цитування працює по-різному. Тут ми вже згадували документи та бекстейки, але є також [[...]]
у ksh та декількох інших оболонках, POSIX $((...))
, case
конструкціях ...
Також зауважте, що котирування може мати і інші побічні ефекти, якщо мова йде про розширення (з подвійними лапками) або при застосуванні до тут роздільників документів. Він також відключає зарезервовані слова і впливає на розширення псевдоніму.
Підсумок
У оболонках, подібних до Борна !#$^&*?[(){}<>~;'"`\|=
, SPC, TAB, NEWLINE та деякі байти з восьмим бітовим набором є або можуть бути спеціальними (принаймні в деяких контекстах).
Щоб вилучити спеціальне значення, щоб вони трактувались буквально, ви використовуєте цитування.
Використання:
'...'
щоб видалити особливе значення кожного персонажа:
printf '%s\n' '\/\/ Those $quoted$ strings are passed literally as
single arguments (without the enclosing quotes) to `printf`'
\
щоб видалити спеціальне значення лише одного символу:
printf '<%s>\n' foo bar\ baz #comment
Зверху \
буквально передається лише пробіл, який передує a printf
. Інші з них оболонки розглядаються як обмежувачі лексеми.
- використовувати
"..."
процитувати символи в той же час дозволяючи розширення параметрів ( $var
, $#
, ${foo#bar}
...), арифметична розкладання ( $((1+1))
також $[1+1]
в деяких оболонках) і підстановки команд ( $(...)
або старою формою `...`
. На Насправді, більшу частину часу, ви хочете помістити ці розширення всередині подвійні лапки в будь-якому випадку . Ви можете використовувати \
всередині, "..."
щоб видалити особливе значення символів, які все ще є спеціальними (але лише їх).
якщо рядок містить '
символ, ви можете використовувати '...'
для відпочинку і використовувати інші механізми , які в лапки можуть цитувати '
як "'"
або \'
чи (якщо такий є) $'\''
:
echo 'This is "tricky", isn'\''t it?'
Використовуйте сучасну $(...)
форму підстановки команд. Використовуйте старий лише `...`
для сумісності з оболонкою Bourne, тобто з дуже старою системою, і лише у змінних призначеннях, як у не використовується:
echo "`echo "foo bar"`"
Що не працюватиме з оболонкою Bourne або AT&T версіями ksh. Або:
echo "`echo \"foo bar\"`"
Який буде працювати з Bourne та AT&T ksh, але не з yash
, а використовувати:
var=`echo "foo bar"`; echo "$var"
яка працюватиме з усіма.
Порядне введення їх у подвійні лапки також неможливо, тому знову використовуйте змінні. Також остерігайтесь спеціальної обробки зворотної косої риски:
var=`printf '%s\n' '\\'`
Збережеться лише одна косою рисою всередині $var
, оскільки існує додатковий рівень обробки зворотної косої риски (для \
, `і $
(а також, "
якщо цитується, окрім yash
) в межах зворотних посилань, тому вам потрібно
var=`printf '%s\n' '\\\\'`
або
var=`printf '%s\n' '\\\'
замість цього.
Csh родина
csh і tcsh мають суттєво різний синтаксис, хоча є ще багато спільного з оболонкою Bourne, оскільки вони мають спільну спадщину.
Спеціальні символи:
"\'&|;()^`<>$
, пробіл, нова лінія та вкладка є спеціальними скрізь, коли вони не цитуються.
#
(csh - оболонка, яка вводиться #
як лідер коментарів) є особливою на початку сценарію або після пропуску без котирування, вкладки чи нового рядка.
*?[
є спеціальними як глобальні оператори, так що в списках контекстів
{non-empty-string}
є спеціальним (csh - оболонка, яка ввела розширення дужок).
!
і ^
є спеціальними як частина розширення історії (знову ж таки, csh винахід), а правила цитування є особливими.
~
(tilde розширення також csh винахід) є особливим у деяких контекстах.
Цитуючи операторів
Вони такі ж, як і для оболонки Борна, але поведінка відрізняється. tcsh поводиться як csh з точки зору синтаксису, ви виявите, що у багатьох версіях csh є неприємні помилки. Отримайте останню версію tcsh, щоб отримати приблизно робочу версію csh.
\
уникає одного символу, за винятком нового рядка (те саме, що для оболонки Борна). Це єдиний оператор котирування, який може вийти з ладу !
. \<newline>
не уникає цього, але перетворює його з сепаратора команд у роздільник токенів (як пробіл)
"..."
вислизає все символи , крім самого, $
, `
, нового рядка і !
. На відміну від оболонки Борна, ви не можете використовувати \
для втечі $
та `
всередині "..."
, але ви можете використовувати \
для втечі !
чи нової лінії (але не себе, за винятком випадків, коли до !
або нового рядка). Буквал !
є, "\!"
а літерал \!
є "\\!"
.
'...'
уникає всіх персонажів, окрім себе, !
та нового рядка. Як і в подвійних котируваннях, !
і в новому рядку можна уникнути зворотної косої риски.
- підміна команд відбувається лише через
`...`
синтаксис і навряд чи може бути надійно використана.
- змінна заміна також досить погано розроблена і схильна до помилок.
$var:q
Оператор допомагає писати більш надійний код з участю змінних.
Підсумок
Тримайтеся подалі від csh, якщо можете. Якщо ви не можете використовувати:
- одинарні цитати, щоб процитувати більшість символів.
!
і новий рядок ще потрібен \
.
\
може втекти від більшості персонажів
"..."
може дозволити деякі розширення всередині нього, але це досить баггі, якщо вони вставляють символи нового рядка та / або зворотній косий риси, найкраще використовувати лише окремі лапки та $var:q
для змінного розширення. Якщо вам потрібно надійно з'єднати елементи масиву, вам потрібно буде використовувати цикли.
rc
сім'я
rc
- це plan9
оболонка та подібні до її нащадків es
і akanga
перенесена на Unix та unix- like . Це оболонка з набагато чистішим і кращим синтаксисом, і той, який би кожен використовував, якби ми не застрягли з оболонками, подібними до Борна, для зворотної сумісності.
rc
/akanga
Спеціальні символи
#;&|^$=`'{}()<>
, SPC, TAB та NEWLINE завжди особливі, коли їх не котирують.
*?[
є глобальними операторами.
Оператор цитування
'...'
є єдиним оператором котирування. Літерал '
пишеться в ''
межах одного лапки, як у:
echo 'it''s so simple isn''t it?'
es
es
можна було розглядати як експериментальну оболонку на основі rc
.
Однак у нього є кілька відмінностей. Цікавим для цього Q / A є те, що \
це також оператор котирування (який цитує всі спеціальні символи, окрім нового рядка), а також може бути використаний для введення послідовностей евакуації, як \n
для нового рядка, \b
для зворотної косої риски ...
риба
риба є відносно новачком (близько 2005 р.), призначена насамперед для інтерактивного використання, а також має суттєво відмінний синтаксис від інших оболонок.
спеціальні символи
"'\()$%{}^<>;&|
завжди особливий, коли його не цитують (відзначте %
(для розширення PID) як істотну відмінність від інших оболонок, і `
не є спеціальним)
#
(коментар) спеціальний, якщо слідує пробіл, котирування, новий рядок або ;&|^<>
*?
(але не [...]
) глобальних операторів
Цитуючи операторів
\
цитує єдиний спеціальний символ, окрім нового рядка, але будьте обережні, він також подвоюється як вступник послідовності C ( \n
, \b
...). IOW, \n
це не котирування, n
а новий рядок.
"..."
цитує все, окрім себе, $
і для зменшення цих показників можна використовувати зворотний кут і нахил. \<newline>
є продовженням лінії (видалено) всередині "..."
.
'...'
цитує все, окрім себе \
, і ви можете використовувати зворотний нахил, щоб уникнути цих.
=
,@
і%
є спеціальними в деяких оболонках в деяких контекстах.