27

bashでは、これを行うと:

mkdir /tmp/empty
array=(/tmp/empty/*)

必要に応じてゼロではなくarray、1つの要素が含まれていることがわかります。"/tmp/empty/*"ありがたいことに、これは、を使用してnullglobシェルオプションをオンにすることで回避できます。shopt -s nullglob

ただし、nullglobはグローバルであり、既存のシェルスクリプトを編集すると、問題が発生する可能性があります(たとえば、誰かがの終了コードls foo*をチェックして、「foo」で始まる名前のファイルがあるかどうかを確認しましたか?)。したがって、理想的には、小さなスコープ、理想的には1つのファイル名拡張に対してのみオンにします。を使用して再びオフにすることができますがshopt -u nullglob、もちろん、以前に無効にされた場合に限ります。

old_nullglob=$(shopt -p | grep 'nullglob$')
shopt -s nullglob
array=(/tmp/empty/*)
eval "$old_nullglob"
unset -v old_nullglob

もっと良い方法があるに違いないと思います。もちろん、変数の代入はサブシェルで終了するため、明らかな「サブシェルに入れる」は機能しません。オースティングループがksh93構文をインポートするのを待つ以外にありますか?

4

5 に答える 5

17

完了したら設定を解除します。

shopt -u nullglob

そして適切に(つまり、以前の状態を保存します):

shopt -u | grep -q nullglob && changed=true && shopt -s nullglob
... do whatever you want ...
[ $changed ] && shopt -u nullglob; unset changed
于 2012-02-03T15:13:43.260 に答える
7

これは、元の提案よりもわずかに優れています。

local nullglob=$(shopt -p nullglob) ; shopt -s nullglob

...好きなことをして...

$nullglob ; unset nullglob
于 2016-01-22T22:53:12.570 に答える
2

これはあなたが望むものに近いかもしれません。そのままでは、globを展開するコマンドを実行する必要があります。

$ ls
file1 file2
$ array=( $(shopt -s nullglob; ls foo*) )
$ ls foo*
ls: foo*: No such file or directory
$ echo ${array[*]}
file1 file2

サブシェルで設定する代わりに、出力がによってキャプチャされるarrayサブシェルを使用してサブシェルを作成します。$()array

于 2012-02-03T14:02:05.660 に答える