フォルダにファイルがあることを確認し、それに応じて終了する方法(KSH)

フォルダにファイルがあることを確認し、それに応じて終了する方法(KSH)

私は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

変数名をすべて大文字にする習慣を捨てる必要があります。

また見なさい:https://mywiki.wooledge.org/ParsingLs

おすすめ記事