zshは変数をプログラムに渡す前にどのように変数を拡張しますか?

zshは変数をプログラムに渡す前にどのように変数を拡張しますか?

zshの基本的な規則は、変数を引用する必要がないということです。たとえば、次のようになります。

% data="single argument"
% print -l $data
single argument

私が知っている1つの例外は、パラメータが空であってもスキップできない場合は二重引用符で囲む必要があることです。

% emptyarg=
% functon count() { echo $# }
% count $emptyarg
0
% count "$emptyarg"
1

ただし、パラメータに特定の特殊文字が含まれている場合は、引用符で囲む必要があります。それ以外の場合は、シェルでエラーが発生します。なぜそんなことですか?非常に弱いようです。私のデータの内容は、関数/コマンドの実行方法に大きく影響しないでください。

ベストアンサー1

私自身の質問に答えるために - スクリプトは動作が期待どおりに機能することを確認しました(引用符なしでパラメータは拡張されません)。特定のオプションが問題を引き起こす可能性があることに気づき、対話型シェルとスクリプトsetoptで実行し、結果を比較しました。setopt noglobsubst目的の効果が見つかるまで1つずつ消しました。簡単に言えば、このGLOB_SUBSTオプションを使用すると、zshは可能な場合はすべての変数を拡張するパターンとして扱います。このオプションを無効にし、チルダパラメータ拡張を使用して必要に応じて変数を拡張できます~

% setopt noglobsubst
% star=*
% echo $star
*
% echo $~star
readme.txt test.sh

おすすめ記事