Kusalananda の回答に対する Stéphane Chazelas のコメントをフォローアップするには:
$ ksh
$ echo ${.sh.version}
Version AJM 93u+ 2012-08-01
$ ls
TABLE1.csv TABLE2.csv
ファイルを保持するために配列を使用します。一部のファイルに一致する glob 式から始めます:
$ typeset -a files
$ files=( ~(N)*.csv )
$ echo "${#files[@]}"
2
$ typeset -p files
typeset -a files=(TABLE1.csv TABLE2.csv)
一致しない「素の」グロブは、一致しないグロブが文字列としてグロブ パターンに置き換えられることを示します。
$ files=( *.txt )
$ echo "${#files[@]}"
1
$ typeset -p files
typeset -a files=('*.txt')
"null glob" プレフィックス付き
$ files=( ~(N)*.txt )
$ echo "${#files[@]}"
0
$ typeset -p files
(empty output)
$
ksh man ページのファイル名生成セクションを参照してください。
質問に具体的に答えるには:
typeset -a contents=( ~(N)"$gp_path"/ALLSTUFF*.zip )
if [[ ${#contents[@]} -eq 0 ]]; then
print 'EMPTY'
exit 0
else
print 'NOT EMPTY'
fi
ALLCAPS 変数名を使用する習慣をやめるべきです。
参照:https://mywiki.wooledge.org/ParsingLs
2>/dev/null
でエラーメッセージを消すことができます ls
の中 .
次に、$CONTENTS
かどうかを確認できます。 -z
で空です
CONTENTS=$(ls -d -- "${gp_path}ALLSTUFF"*.zip 2>/dev/null)
if [ -z "$CONTENTS" ]; then
print 'EMPTY'
exit 0
else
print 'NOT EMPTY'
fi
ファイル名パターンが何かに展開されるかどうかを検出するには、
set -- "$gp_path"ALLSTUFF*.zip
if [ -e "$1" ]; then
echo matched something
else
echo did not match anything
exit 1
fi
set
コマンドは、パターンに一致したファイル名に位置パラメータを設定し、最初に一致したファイル名が存在する場合は、何かに一致しました。何にも一致しなかった場合、パターンは展開されないままになります。
これは ksh
で使用できます 、 bash
およびその他の sh
のようなシェル。