回答:
echo $'$foo'
:$'[...]'
周りのトークンは文字通り(として)$foo
解釈し、そこ$foo
$foo
にあるANSI Cのようなエスケープシーケンスを展開しようとしますが、これらは存在しないため、がecho
生成され$foo
ます。echo $"$foo"
:現在のロケールがPOSIX / Cでない場合、$"[...]"
周りのトークンはその値()に$foo
展開さ$foo
れ、pwd
変換を試みます。現在のロケールのいずれかがPOSIX / Cまたはのために翻訳したものですので、これは、起きていないpwd
、利用できないので、echo
歩留まりpwd
。echo $`$foo`
:`[...]`
周囲のトークン$foo
はの展開を許可する$foo
ため$foo
、その値(pwd
)に展開されます。拡張された値はサブシェルで実行され、その出力(~/scripts
)が`[...]`
トークン全体を置き換えるためecho
、$
トークンの後に~/scripts
トークン($~/scripts
)が生成されます。最終的には、リテラルとそれに続くコマンド置換の組み合わせである$~/scripts
ため、最後の1つが出力されます。したがって、先頭はリテラルとして、末尾はコマンド置換として解釈されます。$`foo`
$
$
$
`$foo`
最初のケース:
echo $'$foo'
どのエコー
$foo
($
私のechoコマンドの最初が削除されることを意味します)
最初$
はコマンドとして実行されます。Echoは引数の間にスペースを必要とせず、引数を取ります。
したがって、echo $'$foo'
は展開してコマンド$
(コマンドではないので無視します)を実行し、次にechoを実行し'$foo'
ます。何か''
は額面通りに受け取られます-それはそれを拡張するものではありません。必要なものを ''に入れても何も起こりません。
をに置き換える$
と$$
、プロセスIDがエコーされます。
第二:
echo $"$foo"
これはエコーします
pwd
(つまり、bashは$foo
、私の変数をその値に展開します)
それ""
はそれが拡大するのを妨げないからです。""
通常、比較する値があることを確認するために使用されます。
空の可能性がある変数がある場合(grep
結果からのものなど)、別の値/変数と比較したい場合は、最初の変数をに配置する必要があります""
。これにより、エラーを発生させるコードの空のセクション(bashが参照)だけでなく、常に比較する比較が存在することが保証されます。
最後に、3番です。これは興味深いものです。
echo $`$foo`
このエコー
$~/scripts
(私は印刷することを期待~/scripts
していません$~/scripts
)
これは(この場合)エコーが$
文字を最初に出力するためです。何かをバッククォートに入れると、変数の値がコマンドとして実行されます(より新しいバージョンのbashでそれを行うためのより良い方法は$(command)
)
したがって、最初にエコーし$
、次に展開`$foo`
し`pwd`
て実行し、戻ります~/Scripts
。しかし、$
以前に印刷物があったので、全体の出力はそうです$~/Scripts
。