Bashでは、grepは\で始まる行を検索し、バックティックを使用して結果を割り当てます。

Bashでは、grepは\で始まる行を検索し、バックティックを使用して結果を割り当てます。

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/Quoteshttp://mywiki.wooledge.org/Argumentsそしてhttp://wiki.bash-hackers.org/syntax/words

だから結局:

echo \\Hello > myFile
out="$(grep '^\\Hello' myFile)"
echo "$out"

おすすめ記事