"$(findmnt | grep "\""proc"\"" | head -n 1)" 長さが 0 の理由は何ですか? (ここで二重引用符をエスケープするために `` \ '' 'を使用すると、どのような問題がありますか?)

私が驚いた点は次のとおりです。

$ if [ -n "$(findmnt | grep "\""proc"\"" | head -n 1)" ]; then echo 1; else echo 2; fi
2

"\""この記事を読んだ後、IIRC以前に使用しましたhttps://unix.stackexchange.com/a/187452/446998、最終的に動作します。

$ echo "1"\""2"\""3"
1"2"3

最初のケースではなぜできませんか?

また訪れるシェルで引用符をエスケープする方法は?そして、許可された答えに従おうとすると、反対の問題が発生しました。存在しないインストールを見つけることです。

$ if [ -n $'$(findmnt | grep "\proc111"\ | head -n 1)' ]; then echo 1; else echo 2; fi
1

内部的にはgrep引用符なしで動作します。

~$ if [ -n "$(findmnt | grep proc111 | head -n 1)" ]; then echo 1; else echo 2; fi
2
~$ if [ -n "$(findmnt | grep proc | head -n 1)" ]; then echo 1; else echo 2; fi
1

提案を読んでみました。コマンドの置き換えで二重引用符をエスケープするしかし、私のコードにすぐに適用することはできません。

ベストアンサー1

問題は、二重引用符が誤ってエスケープされているのではなく、出力が一致しない"proc"(二重引用符で囲まれている)ようですfindmnt

デフォルトの出力はforとfor and(少なくとも私が見たすべてのバージョンでは)のみfindmnt表示されます。/procTARGETprocSOURCEFSTYPEfindmnt

findmnt -J出力するので、"proc"式に一致するが、再びjq

おすすめ記事