Bashでは、ファイル内で\で始まる行を探し、バックティックを使用して結果を返そうとします。
たとえば、
echo \\Hello > myFile
out=`cat myFile | grep '^\\Hello'`
echo $out
何も返されなくても
cat myFile | grep '^\\Hello'
期待どおりに返されます。
\Hello
これは非常に奇妙なシェルの動作のように見えます。特に、tcshの同様のコマンドシーケンスは期待どおりに実行されます。
set out=`cat myFile | grep '^\\Hello'`; echo $out
返品
\Hello
何が起こっているのかを説明できる人はいますか?ありがとう
答え1
読むhttp://mywiki.wooledge.org/BashFAQ/082特に
バックティック内のバックスラッシュは明確な方法で処理されます。
:
`...`
最も古い非POSIX準拠のBourne-Shellにのみ必要なレガシー構文。常にSyntaxを好む理由はいくつかあります$(...)
。
echo \\Hello > myFile
代わりに
out=$(cat myFile | grep '^\\Hello')
少し簡単にするには:
out=$(grep '^\\Hello' myFile)
それから
echo $out
スペース/メタ文字を含む各リテラルの「二重引用符」とすべて拡張子: "$var", "$(コマンド "$var")", "${array[@]}", "a & b"。コードまたはリテラル $: "costs $5", ssh ホスト "echo "$HOSTNAME"" を表すには、「一重引用符」を使用します。バラよりhttp://mywiki.wooledge.org/Quotes、http://mywiki.wooledge.org/Argumentsそしてhttp://wiki.bash-hackers.org/syntax/words。
だから結局:
echo \\Hello > myFile
out="$(grep '^\\Hello' myFile)"
echo "$out"