Bash 見積もり拡張パズル

Bash 見積もり拡張パズル

私のスクリプトは次のとおりです

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 curl2文字の最後の引数があります''。エスケープされた特殊文字追跡:'次のように表示されます'\''(一重引用符の中に一重引用符を「エスケープ」する一般的な慣用語)。正式には、空の''\'''\'''一重引用符文字列、''その後にバックスラッシュ引用符文字\'、再''、再\'、最後に構成されます''。 (Kshはこれを少し読みやすく表示します$'\'\''。)2番目の呼び出しでは4つの文字が渡されます\'\'

一般的なsh構文解析ルールでは、引用符なしの変数を拡張して空のパラメータを生成することはできません。単語分割は、空白ではなく文字または引用符付きの部分のみを切り取ります。

Bashを使用しているので、複数のオプションを配列に入れることができます。これはkshとzshにも当てはまります。

opts=(-x "")
curl http://somepage "${opts[@]}"

この特別なケースでは、代わりに環境変数をオーバーライドできます。

http_proxy= curl http://somepage

おすすめ記事