
私はKSHを持っています(大きな打撃ではない)プリエンプトされたスクリプトをファイル数で確認したいと思います。ファイルがない場合は、「EMPTY」を印刷して終了したいと思います。それ以外の場合は続けます。
問題は、ファイルの数を数えるとファイルが空になったり中断されることです。
パスワード:
###################################################
# Test to see if files exist in Drop Folder
###################################################
CONTENTS=$(ls ${gp_path}ALLSTUFF*.zip)
if [[ ${#CONTENTS[@]} -eq 0 ]]; then
print 'EMPTY'
exit 0
else
print 'NOT EMPTY'
fi
空でない場合は有効です。
空の場合、次のエラーが発生し、システムがクラッシュします。 EMPTYを報告し、0で終了したいと思います。
間違い:
/nas/Opt/databox/folder/ALLSTUFF*.zip not found
私は何が間違っていましたか?
試み #2
私もこれを試しましたが、同じ結果を得ました。
if [ "$(ls ${gp_path}ALLSTUFF*.zip)" ]; then
print 'NOT EMPTY'
else
print 'EMPTY'
exit 0
fi
答え1
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)
一致しない「ネイキッド」globは、一致しないglobがglobパターンによって文字列に置き換えられることを示しています。
$ 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 のマニュアルページの「ファイル名の生成」を参照してください。
お客様の質問に具体的に回答するには:
typeset -a contents=( ~(N)"$gp_path"/ALLSTUFF*.zip )
if [[ ${#contents[@]} -eq 0 ]]; then
print 'EMPTY'
exit 0
else
print 'NOT EMPTY'
fi
変数名をすべて大文字にする習慣を捨てる必要があります。
答え2
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
答え3
ファイル名パターンがどのように拡張されているかを検出するには、次のようにします。
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
同様のシェルで使用できます。