Linuxコマンドエスケープ

Linuxコマンドエスケープ

デフォルトでは、ファイルの文字列を置き換える私が作成したスクリプトからコマンドを実行しようとしています。

vzctl exec VZID sed -i 's/\/>/address="$IP\/255.255.255.0"\/\>/' "file.xml"

問題は、コマンドが欠落していることです'"

'とを維持するようにコマンドを避ける方法はありますか"?それともどのようにカプセル化しますか?

ベストアンサー1

おそらくこれはvzctl exec次のとおりですevalシェルコマンドラインは、受け取った引数を連結して生成されます。したがって、有効なシェルコマンドラインを引数として渡す必要があります。これは別のレベルの引用を意味します。

vzctl exec VZID '
  sed -i '\''s/\/>/address="$IP\/255.255.255.0"\/\>/'\'' "file.xml"'

$IPご注意くださいいいえ拡大されます。これを行うには、次のものが必要です。

vzctl exec VZID '
  sed -i '\''s/\/>/address="'"$IP"'\/255.255.255.0"\/\>/'\'' "file.xml"'

コマンドを解釈するシェルを介してコマンドを拡張するには、次のようにvzctlします。

vzctl exec VZID '
  sed -i '\''s/\/>/address="'\''"$IP"'\''\/255.255.255.0"\/\>/'\'' "file.xml"'

呼び出しシェルによって拡張されますvzctl exec(シェルがその$IP変数にアクセスできると仮定)。

わかりやすくするために、ここにあるドキュメントを使用してコードを変数に保存する方が簡単です。たとえば、次のようになります。

code=$(cat <<EOF
sed -i 's|/>|address="$IP/255.255.255.0"/>|' file.xml
EOF
)

(ここではこのドキュメント形式は変数を拡張します(ここ$ID))。

次のように実行します。

vzctl exec VZID "$code"

おすすめ記事