エスケープされた引用符内で引用符をエスケープすることは可能ですか?

エスケープされた引用符内で引用符をエスケープすることは可能ですか?

私がしたいのは、私からコマンドを実行することです。

su - someuser -c "ssh someplace \"if ( ! grep <b>[WHAT DO I PUT HERE?]</b>some thing<b>[WHAT DO I PUT HERE]</b> /etc/somefile ); then doSomething; fi\""

私を混乱させる文字列をgrepするのはその引用符です。それでは、空白なしでコンテンツをgrepして問題を解決しましょう。ただし、grepしたい項目をgrepすることをお勧めします。

答え1

3つの引用符を追加することは機能しません。引用解除、引用、および再引用解除のみ可能です。サブシェルも必要ありません。

あなたが本当に欲しいものは:

su - someuser -c 'ssh someplace "if ! grep \"some thing\" /etc/somefile; then doSomething; fi"'

このアプローチは迅速に扱いにくくなる可能性があります。サーバーにスクリプトを配置して実行することを検討してください。これにより、ネストされた参照地獄から抜け出すことができます。

答え2

ここにある文書を使用してください。

su -someuser -c '<&1 >&2 ssh you@machine sh' 1<<\SCRIPT
    if   ! grep 'some spaces or whatever' /etc/somefile
    then : do something
    fi
#END
SCRIPT

suで読み取った初期パスワードを渡す必要があり、su2より大きいファイル記述子を渡さないため、このソリューションには少しfdジャグリングが必要です。ただし、一度認証するとsui ssh/ oを台無しにしないため、すぐに再割り当てされ、もう一方の端で呼び出されたシェルがstdinを読み取ることができます。

関連情報