それはシェルに大きく依存します。詳細については、シェルのマニュアルを確認してください。
また、一部の文字は一部のコンテキストでのみ特別であることに注意してください。例えば、ほとんどのシェルでは、*
と?
リストコンテキストでのみ特別なものは、POSIXまたはcshのようなシェルで、~
単語など一部の文字を次の先頭にのみ特別です:
。以下のための同じ=
の中でzsh
。一部のシェルで[
は、に一致する場合(制限付き)のみが特別]
です。
bash
やなどの一部のシェルではyash
、空白トークン区切り文字などの特殊文字もロケールによって異なります。
引用演算子(これらの文字の特別な意味を削除するため)も、シェルによって大きく異なります。
ボーンのようなシェル
Bourneのようなシェル(つまりsh
、80年代以降、何らかのシステムで呼び出されることが知られているシェル)の概要:
ボーンシェル
特殊文字:
"\'&|;()^`<>$
、スペース、改行、およびタブは、引用されていない場合、単純なコマンドラインでは特別です。
#
(初期バージョンを除く)は、行頭または引用符で囲まれていないスペース、タブ、または&|()^<>;`
。
{
そして}
、それらがシェルキーワードであるという点でのみ特別です(したがって、コマンド位置にある単語のみ)。
*?[
グロビング演算子として特別なので、リストコンテキストでのみ。の場合[
、それ[...]
はグロビング演算子です、[
または]
のみ特別な意味を取り除くために引用符で囲む必要があります。
=
代入演算子として扱われるコンテキストでは特別です。つまり、単純なコマンドでは、引数の後に続かないすべての単語に対して(を除くset -k
)。
引用演算子
\
改行を除くすべての特殊文字を引用符で囲みます(\<newline>
長い論理行を次の物理行に続ける方法であるため、そのシーケンスは削除されます)。バックティック\
は、それらの内部に追加の複雑さを追加することに注意してください。これは、最初に閉じているバックティックをエスケープし、パーサーを支援するために使用されます。二重引用符の中では、\
それ自体をエスケープするためにのみ使用できます"
、$
および`
(\<newline>
まだ行継続です)。ヒアドキュメント内、を除いて同じ"
。\
hereドキュメント内の文字をエスケープする唯一の方法です。
"..."
二重引用符は、すべての文字をエスケープするが、それ自体、\
、$
と`
。
'...'
単一引用符は、それ以外のすべての文字をエスケープします。
POSIXシェル
POSIXシェルは、Bourneシェルとほとんど同じように動作しますが、次の点が異なります。
ksh
以下を除いてPOSIXに似ています:
{string}
文字列が引用符で囲まれていない場合,
(または..
場合によってはバージョンによっては)特別です。
- ksh93には、追加の特別な引用演算子があります:
$'...'
複雑なルールです。すなわち、オペレータはまた、(いくつかのバリエーションで)発見されbash
、zsh
、mksh
およびFreeBSDとbusyboxのsh
。
ksh93
また、文字列がローカライズの対象となることを除いて$"..."
同様に機能する引用演算子もあり"..."
ます(ユーザーの言語に翻訳するように構成できます)。inをmksh
無視$
し$"..."
ます。
bash
がksh93
、しかし:
- シングルバイト文字ロケールでは、すべて空白(ロケールによる)文字は区切り文字(スペースやタブなど)と見なされます。つまり、一部のロケールで空白文字になる可能性がある場合に備えて、すべてのバイトを8番目のビットセットで引用する必要があるということです。
- 対話型インスタンスのようにcsh履歴展開が有効になっている場合、
!
一部のコンテキストでは特殊であり、二重引用符は常にエスケープされません。また^
、コマンドの先頭では特別です。
zsh
がksh93
、しかし:
bash
csh履歴展開の場合と同じ注意
=
単語の最初の文字として特殊です(に=ls
展開されます/bin/ls
)。
{
また、}
区切られていないときにコマンドグループを開いたり閉じたりすることもできます({echo text}
Bourneのような作品のように{ echo text;}
)。
[
単独での[
場合を除き、aで閉じられていなくても引用符で囲む必要があります]
。
- では
extendedglob
オプション、有効#
、^
および~
演算子をグロブしています。
- では
braceccl
オプションで、{non-empty-string}
特別です。
$"..."
サポートされていません。
- 特別な癖として、単語の先頭で(引用または展開されていても)
?
続く場合は特別ではありません%
(%?name
ジョブの指定を可能にするため)
rcquotes
(デフォルトでは有効になっていません)オプションは、1のように単一引用符を入力することができます''
ラà内部の単一引用符rc
(下記参照します)。
yash
それPOSIX
以外は好きです。
- すべての空白文字は区切り文字と見なされます。
- この
brace-expand
オプションを使用すると、zshスタイルのブレース拡張が実装されます。
すべてのシェルには、クォートの動作が異なる特別なコンテキストがいくつかあります。すでにここでドキュメントとバックティックについて言及しましたが[[...]]
、kshや他のいくつかのシェルPOSIX $((...))
にもあります。case
構造...
また、二重引用符を使用した展開や、ここでのドキュメントの区切り文字に適用される場合、引用符は他の副作用をもたらす可能性があることに注意してください。また、予約語を無効にし、エイリアスの展開に影響します。
概要
Bourneライクシェルでは!#$^&*?[(){}<>~;'"`\|=
、SPC、TAB、NEWLINE、および8ビットが設定された一部のバイトは、(少なくとも一部のコンテキストでは)特別であるか、または特別である可能性があります。
特別な意味を削除して文字どおりに処理するには、引用符を使用します。
使用する:
'...'
すべてのキャラクターの特別な意味を削除するには:
printf '%s\n' '\/\/ Those $quoted$ strings are passed literally as
single arguments (without the enclosing quotes) to `printf`'
\
1文字のみの特別な意味を削除するには:
printf '<%s>\n' foo bar\ baz #comment
上記では、a \
が前にあるスペース文字のみが文字通りに渡されprintf
ます。他のものは、シェルによってトークン区切り文字として扱われます。
- 使用
"..."
まだパラメータ展開(可能にしながら、文字を引用するために$var
、$#
、${foo#bar}
...)、(算術展開$((1+1))
も、$[1+1]
一部のシェルでは)とコマンド置換($(...)
または古い形式を`...`
。実際には、ほとんどの時間は、あなたが内側にそれらの拡張を入れたいですいずれの場合も二重引用符.withinを使用\
し"..."
て、まだ特別な文字(ただしそれらだけ)の特別な意味を削除できます。
文字列に文字が含まれている場合'
でも'...'
、残りに使用したり、またはまたは(利用可能な場合)の'
ように引用できる他の引用メカニズムを使用できます。"'"
\'
$'\''
echo 'This is "tricky", isn'\''t it?'
最新の$(...)
形式のコマンド置換を使用します。`...`
Bourneシェルとの互換性のためにのみ、つまり非常に古いシステムで、変数の割り当てでのみ使用します。使用しないでください。
echo "`echo "foo bar"`"
BourneシェルまたはkshのAT&Tバージョンでは機能しません。または:
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の発明)、引用ルールは特別です。
~
(チルダ展開もcshの発明)は、一部のコンテキストでは特別です。
引用演算子
これらはBourneシェルの場合と同じですが、動作が異なります。tcshは構文の観点からはcshのように動作しますが、cshの多くのバージョンには厄介なバグがあることがわかります。最新バージョンのtcshを入手して、おおよそ動作するバージョンのcshを入手してください。
\
改行を除く1文字をエスケープします(Bourneシェルと同じ)。エスケープできる唯一の引用演算子です!
。\<newline>
エスケープしませんが、コマンド区切り文字からトークン区切り文字(スペースなど)に変換します
"..."
、自分自身を除くすべての文字をエスケープし$
、`
改行と!
。Bourneシェルとは異なり、\
エスケープ$
および`
insideには使用できませ"..."
んが\
、エスケープ!
または改行には使用できます(ただし、a !
またはnewlineの前を除き、それ自体は使用できません)。リテラル!
はで"\!"
あり、リテラル\!
は"\\!"
です。
'...'
それ自身!
と改行を除くすべての文字をエスケープします。二重引用符と同様に!
、改行はバックスラッシュでエスケープできます。
- コマンド置換は
`...`
構文を介してのみ行われ、確実に使用することはほとんどできません。
- また、変数の置換は非常に不適切に設計され、エラーが発生しやすくなります。
$var:q
オペレータは、変数を含むより信頼性の高いコードを書くのに役立ちます。
概要
可能であれば、cshから離れてください。使用できない場合:
- ほとんどの文字を引用する単一引用符。
!
と改行はまだ必要\
です。
\
ほとんどの文字をエスケープできます
"..."
その中にいくつかの展開を許可することができますが、改行文字やバックスラッシュ文字を埋め込む場合はかなりバグが多く、単一の引用符のみを使用し$var:q
て変数を展開することをお勧めします。配列の要素を確実に結合するには、ループを使用する必要があります。
rc
家族
rc
あるplan9
シェルは、その子孫のようにes
し、akanga
UnixとUnixの同類に移植されています。これは、はるかに簡潔で優れた構文を持つシェルであり、下位互換性のためにBourneのようなシェルにこだわっていなければ誰もが使用するシェルです。
rc
/akanga
特殊文字
#;&|^$=`'{}()<>
、SPC、TAB、およびNEWLINEは、引用されていない場合は常に特別です。
*?[
グロビング演算子です。
引用演算子
'...'
唯一の引用演算子です。リタラル'
は''
、次のように単一引用符で囲んで記述されます。
echo 'it''s so simple isn''t it?'
es
es
に基づいた実験的なシェルとして見ることができますrc
。
ただし、いくつかの違いがあります。このQ / Aで興味深いの\
は、引用演算子(改行を除くすべての特殊文字を引用する)であり\n
、改行、\b
バックスラッシュなどのエスケープシーケンスの導入にも使用できることです...
魚
fishは比較的新しい(2005年頃)であり、主にインタラクティブな使用を目的としており、他のシェルとは大幅に異なる構文も持っています。
特殊文字
"'\()$%{}^<>;&|
引用されていない場合は常に特別です%
((pid展開の場合)他のシェルとの重要な違いであり、`
特別ではないことに注意してください)
#
(コメント)引用符で囲まれていないスペース、タブ、改行、または ;&|^<>
*?
(ただしではない[...]
)グロビング演算子
引用演算子
\
改行を除く単一の特殊文字を引用しますが、Cエスケープシーケンス(\n
、\b
...)イントロデューサーとしても機能することに注意してください。IOW \n
は、引用符ではなくn
改行です。
"..."
それ自体を除くすべてを引用し$
、バックスラッシュとバックスラッシュを使用してそれらをエスケープできます。\<newline>
内部の行継続(削除)"..."
です。
'...'
それ自体とを除くすべてを引用し、\
バックスラッシュを使用してそれらをエスケープできます。
=
、@
および%
一部のコンテキストの一部のシェルでは特別です。