
私のスクリプトは次のとおりです
opts="-x ''"
curl http://somepage $opts
$opts
コマンドに文字列を追加したいです。拡張子を確認しましたが、bash -x test.sh
単一引用符が削除されたことを確認しました。
私がそれを次のように変更した場合:
opts="-x \'\'"
拡張後には4つの一重引用符があります。
答え1
正確に何を見ましたか?スクリプトとして
opts="-x ''"
echo curl http://somepage $opts
opts="-x \'\'"
echo curl http://somepage $opts
bash 3.2.39または4.1.5を使用するとわかります。
+ opts='-x '\'''\'''
+ echo curl http://somepage -x ''\'''\'''
curl http://somepage -x ''
+ opts='-x \'\''\'\'''
+ echo curl http://somepage -x '\'\''\'\'''
curl
(well、)への最初の呼び出しには、echo curl
2文字の最後の引数があります''
。エスケープされた特殊文字追跡:'
次のように表示されます'\''
(一重引用符の中に一重引用符を「エスケープ」する一般的な慣用語)。正式には、空の''\'''\'''
一重引用符文字列、''
その後にバックスラッシュ引用符文字\'
、再''
、再\'
、最後に構成されます''
。 (Kshはこれを少し読みやすく表示します$'\'\''
。)2番目の呼び出しでは4つの文字が渡されます\'\'
。
一般的なsh構文解析ルールでは、引用符なしの変数を拡張して空のパラメータを生成することはできません。単語分割は、空白ではなく文字または引用符付きの部分のみを切り取ります。
Bashを使用しているので、複数のオプションを配列に入れることができます。これはkshとzshにも当てはまります。
opts=(-x "")
curl http://somepage "${opts[@]}"
この特別なケースでは、代わりに環境変数をオーバーライドできます。
http_proxy= curl http://somepage