次の問題があります。ワイルドカード文字をプレーンテキストとして含む環境変数が必要ですが、これをエスケープできないようです。バックスラッシュエスケープを使用すると機能しますが、何らかの理由でバックスラッシュはまだ文字列の一部です。 」
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
オプションが有効になっているため、引用符なしの拡張は$test
POSIXシェルと同様にワイルドカードの影響を受けます。 2番目のケースでは文字列を割り当てます\*
が、バックスラッシュはアスタリスクをエスケープするため、globには展開されません。 (そうでなければ、zshは無効にしない限り、一致するファイルがないと文句を言います。バックスラッシュで始まるファイル名がない可能性がありますが、一致するglobは\\*
.)
グローブを停止するには、変数拡張を引用します(例:echo "$test"
。
望むより:いつ二重引用符が必要ですか?
export
また、同じシェル内でのみ(またはデフォルトのシェルとソーススクリプトの間でも)変数を使用したい場合は必要ありません。