(z)shスクリプトでアスタリスク/グローブを正しくエスケープします。

(z)shスクリプトでアスタリスク/グローブを正しくエスケープします。

次の問題があります。ワイルドカード文字をプレーンテキストとして含む環境変数が必要ですが、これをエスケープできないようです。バックスラッシュエスケープを使用すると機能しますが、何らかの理由でバックスラッシュはまだ文字列の一部です。 」

GLOB_SUBSTを無効にすると問題は解決しますが、これを回避したいと思います。

問題の範囲を絞り込むために、次の方法を使用しました。

touch foo; chmod +x ./foo

# glob expansion i.E. $test contains all files in the directory.
echo 'export test="*"; echo $test' > foo; source ./foo 

# no glob expansion, but the escape character is added to the string.
echo 'export test="\*"; echo $test' > foo; source ./foo  
# output: \*

どんな助けでも大変感謝します。

答え1

最初のケースでは、文字列を*変数に割り当て、対応するglobsubstオプションが有効になっているため、引用符なしの拡張は$testPOSIXシェルと同様にワイルドカードの影響を受けます。 2番目のケースでは文字列を割り当てます\*が、バックスラッシュはアスタリスクをエスケープするため、globには展開されません。 (そうでなければ、zshは無効にしない限り、一致するファイルがないと文句を言います。バックスラッシュで始まるファイル名がない可能性がありますが、一致するglobは\\*.)

グローブを停止するには、変数拡張を引用します(例:echo "$test"

望むより:いつ二重引用符が必要ですか?

exportまた、同じシェル内でのみ(またはデフォルトのシェルとソーススクリプトの間でも)変数を使用したい場合は必要ありません。

関連情報