回答:
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。