「二重引用符文字(」)をどのように入力しますか?が要求されており、同じ回答でコミュニティを怒らせたくありません。 (s
\"
に含まれていない場合は入力し、sに含まれている場合は'
入力してください。)したがって、質問は次のようになります。"
'
通常の文字のように端末に特殊文字を入力することはできません。たとえば、このコマンドは失敗します。
echo Updates (11)
それでは、端末で通常の文字のようにこれらの文字をどのように入力しますか?
!#$^&*?[](){}<>~;'"\|<space><tab><newline>
答え1
多くはケーシングに依存します。詳細については、シェルのドキュメントを確認してください。
また、一部の文字は特定の状況でのみ特殊であることに注意してください。たとえば、ほとんどのシェルではリストコンテキストでのみ特殊であり、POSIXやcshなどのシェルでは*
単語の先頭または後に特定の文字(たとえば)があります。にも同様に適用されます。一部のシェルでは、と一致する場合にのみ特別です(いくつかの制限があります)。?
~
:
=
zsh
[
]
一部のシェル(たとえば、bash
または)では、yash
特殊文字(スペース区切りなど)もロケール設定によって異なります。
引用演算子(これらの文字の特別な意味を取り除くため)もシェルによって大きく異なります。
ボンのような殻
sh
Bourneに似たシェル(つまり、1980年代以降に一部のシステムで呼び出されることが知られているシェル)の概要:
ボンシェル
特殊文字:
"'&|;()^`<>$
、スペース、改行、およびタブは、引用符がない場合は単純なコマンドラインで特別です。#
(以前のバージョンを除く)行の先頭にスペース、タブ、または&|()^<>;`
。{
の特別な点は、}
シェルキーワード(したがってコマンド位置にある単語のみ)ということです。*?[
ワイルドカードで特別なので、リストコンテキストでのみ可能です。ワイルドカードの場合は、引用するか[
特別な意味を削除します。[...]
[
]
=
これは、割り当て演算子の文脈で見ると特別です。つまり、単純なコマンドでset -k
引数に従わないすべての単語(以降は除く)に適用されます。
参照演算子
\
改行を除くすべての特殊文字を引用することは、\<newline>
非常に長い文字を続ける方法です。論理的次へ物理シーケンスを削除する行)。バックティックは、\
最初に閉じるバックティックをエスケープしてパーサーを助けるために使用されるため、複雑さを増すことに注意してください。二重引用符内では、\
それ自体をエスケープするためにのみ使用できます"
($
まだ行連続文字)`
。\<newline>
この文書内で文字をエスケープする唯一の方法は"
。\
"..."
\
二重引用符は、自分を$
除くすべての文字をエスケープします`
。'...'
一重引用符は、自分以外のすべての文字をエスケープします。
POSIXシェル
POSIX シェルの動作は、以下を除いて、デフォルトで Bourne シェルと似ています。
^
これ以上特殊文字はありません。~
はい場合によっては特別{
特別広告は許可されているので引用する必要があります。
ksh
以下を除いて、POSIXに似ています。
{string}
,
文字列に引用符が含まれていない場合(または..
一部の場合と一部のバージョン)は特別です。$'...'
ksh93には、複雑な規則を使用する追加の特殊参照演算子があります。この演算子はbash
FreeBSDzsh
、FreeBSD、およびbusyboxmksh
にもあります(一部のバリエーションあり)sh
。ksh93
$"..."
文字列をローカライズする必要があることを除いて、同様に機能する参照演算子もあります"..."
(ユーザー言語に変換するように構成できます)。ではmksh
無視してください。$
$"..."
ksh93r
cshスタイルの履歴拡張は対話型シェルでサポートされているためksh93
(デフォルトでは有効ではありません)、コマンドの起動は特別になります。状況によっては特別であり(スペースやTABが後ろにある場合やこの記事ではそうではありません)、二重引用符でエスケープされません。バックスラッシュ(特別な意味を削除する二重引用符ではなく)と一重引用符のみがエスケープされます。-H
-o histexpand
^
!
!
\
!
bash
次のようになりますがksh93
:
- シングルバイト文字ロケールでは、すべてスペース(ロケールに応じて)文字は区切り文字(スペースやタブなど)として扱われます。実際、これは、一部のロケールで空白文字である可能性がある場合は、ビット8が設定されているすべてのバイトを引用する必要があることを意味します。
- csh履歴拡張は、上記のksh93と同じコメントを使用して、インタラクティブインスタンスでデフォルトで最新バージョンでのみ有効になり
bash
ます。!
"
- csh と同様に、
%
操作を実行するためにコマンドの先頭に使用されます。コマンド%1
を実行する代わりに、最初のタスクをフォアグラウンドにインポートします。背景に入れても%1
同じ..%1 &
zsh
次のようになりますがksh93
:
- バックスラッシュを除いて、csh履歴拡張と同じコメントを使用して、cshと同様に二重引用符内でエスケープ
bash
できます。!
=
これは単語の最初の文字(=ls
拡張子/bin/ls
)が特別なためです。%
コマンド位置の bash と同じ説明です。{
そう}
でなければ、コマンドグループを開いて閉じることもできます({echo text}
Bourneの仕事のように{ echo text;}
)。[
特別な場合を除き、で[
終わらなくても引用は必須です]
。- この
extendedglob
オプションが有効な場合、#
および^
は~
ワイルドカード演算子です。 - この
braceccl
オプションを使用すると{non-empty-string}
特別です。 $"..."
サポートしていません。- 珍しいことは、
?
単語の先頭(または引用または拡張)の後にaが続く場合(作業仕様を許可するために)特別ではないことです。%
%?name
- オプション
rcquotes
(デフォルトでは有効ではありません)を使用すると、一重引用''
符内に一重引用符を入力できますrc
(下記参照)。
yash
それを除いてPOSIX
。
- すべての空白文字は区切り文字と見なされます。
brace-expand
zshスタイル中括弧拡張を実装するには、このオプションを使用します。- コマンド位置の bash および zsh と同じ説明です
%
(POSIX モードを除く).
すべてのシェルと同様に、引用が異なる動作をする特別な状況があります。ここではすでにドキュメントとバックティックについて言及していますが、[[...]]
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`'
\
文字の特別な意味だけを削除します。printf '<%s>\n' foo bar\ baz #comment
上記では、aの前の空白文字のみが
\
文字通りに渡されますprintf
。他のものはシェルのトークン区切り文字として扱われます。パラメータ拡張(、、、...)、算術拡張(一部のシェルでも)を
"..."
許可しながら文字を引用するために使用されます。$var
$#
${foo#bar}
$((1+1))
$[1+1]
コマンドの置き換え($(...)
または以前の形式です`...`
。実際にはほとんどの場合とにかく私はこの拡張を二重引用符の中に入れたいと思います。。\
inside を使用すると、"..."
まだ特別ですが、その文字だけがその文字の特別な意味を削除できます。文字列に文字が含まれている場合は、残りの文字を引き続き使用でき、
'
orまたは(利用可能な場合)などの引用符で使用できる他の引用メカニズムを使用できます。'...'
'
"'"
\'
$'\''
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
(2020年の編集者:2.41以下のバージョンでのみ、2.42から変更されました。/エラーレポート/犯罪)、しかし、以下を使用してください。var=`echo "foo bar"`; echo "$var"
これはすべての人に適用されます。
また、二重引用符を使用して移植可能に入れ子にすることはできないため、変数は再利用されます。また、特別なバックスラッシュ処理に注意してください。
var=`printf '%s\n' '\\'`
$var
バックスラッシュの内部に追加のバックスラッシュ処理レイヤーがあるため(\
、 `、および$
("
引用符を除く))、バックスラッシュは内部的にのみ保存されるため、yash
次のものが必要です。var=`printf '%s\n' '\\\\'`
または
var=`printf '%s\n' '\\\'
代わりに。
Cesファミリー
cshとtcshは構文が大きく異なりますが、共有の遺産のためにBourneシェルとまだ多くの共通点があります。
特殊文字:
"'&|;()^`<>$
、空白、改行、タブは引用符なしでどこでも特別です。#
(cshはコメントリーダーとして導入されたシェルです#
)は、スクリプトの先頭、または引用符で囲まれていないスペース、タブ、または改行文字の後に特別です。*?[
ワイルドカードとして特別なので、リストコンテキストで{anything}
独立した特別な場合を除いては特別です{}
(cshは中括弧拡張を導入するシェルです)。!
^
歴史的拡張(cshの発明でもある)の一部として特別であり、引用規則も特別です。~
(チルダ拡張もcsh発明です。)場合によっては特別です。- bash、zsh、yashと同様に、コマンドの場所
%
はジョブの操作に使用されます(cshの他の発明)。
参照演算子
Bourneシェルと同じですが、動作は異なります。構文の観点から見ると、tcshはcshのように動作し、多くのcshバージョンに深刻なバグがあることがわかります。おおよそ動作する csh バージョンを取得するには、最新バージョンの tcsh を入手してください。
\
改行以外の単一文字をエスケープします(Bourneシェルと同じ)。エスケープできる唯一の参照演算子です!
。\<newline>
エスケープしませんが、コマンド区切り文字からトークン区切り文字(スペースなど)に変換します。"..."
$
自分、、`
改行、およびを除くすべての文字をエスケープします!
。 Bourneシェルとは異なり、\
escape$
と`
insideは使用できませんが、escapeまたはnewlineは"..."
使用できます(ただし、aまたはnewlineが前にない限りそれ自体は使用できません)。馬は、馬は。\
!
!
!
"\!"
\!
"\\!"
'...'
!
自分と改行を除くすべての文字をエスケープします。二重引用符と同様に、!
改行文字もバックスラッシュでエスケープできます。- コマンドの置換は構文を介してのみ可能であり、安定して
`...`
使用することは困難です。 - 変数の置き換えも設計が非常に間違っているため、エラーが発生しやすいです。演算子は、
$var:q
変数に関連するより信頼性の高いコードを書くのに役立ちます。
一般化する
可能であればcshを離れてください。利用できない場合:
- 一重引用符はほとんどの文字を引用します。
!
改行文字がまだ必要です\
。 \
ほとんどの文字から抜け出すことができます"..."
$var:q
一部の拡張を許可することは可能ですが、改行および/またはバックスラッシュ文字が含まれている場合は問題が発生するため、単一引用符を使用して変数拡張を実行することをお勧めします。配列の要素を確実に連結するには、ループを使用する必要があります。
rc
家族
rc
plan9
殻です。 plan9コードはFLOSSとしてリリースされ、対応するユーザー空間ソフトウェアはrc
Linuxに移植されました。Byron Rakitzisはまた、1990年代初頭にUnix用のレプリカを作成しましたrc
。es
akanga
以前のバージョンとの互換性のために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>
内部連続ライン(削除済み)です"..."
。'...'
自分とを除くすべての項目を引用し、\
バックスラッシュを使用してエスケープできます。
答え2
1. 脱出
次のようにすべての文字をエスケープするには、aを使用します\
(改行/キャリッジリターン文字では機能しません)。
$ echo Use a \"\\\" symbol to escape characters.
Use a "\" symbol to escape characters.
2.二重引用符
次のようにテキスト全体を"
sで囲みます。
$ var=variables;echo "Enclose text in \"s. You can also use $var in them. `echo Surprise!!!`"
Enclose text in "s. You can also use variables in them. Surprise!!!
3. 一重引用符
二重引用符と同じですが、特別なマークはありません。
$ proof=proveit;echo 'This should not read "proveit": $proof'
This should not read "proveit": $proof