
デフォルトでは、ファイルの文字列を置き換える私が作成したスクリプトからコマンドを実行しようとしています。
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"
答え2
コマンド全体を引用符で囲み、バックスラッシュで内部を区切ってみましたか?
私の言葉は:
vzctl exec VZID 'sed -i \'s/\/>/address=\"$IP\/255.255.255.0\"\/\>/\' \"file.xml\"'
一重引用符が機能しない場合は、二重引用符も確認しますが、そうする必要があると思います。