如何找出文件夹中是否有文件并相应退出(在KSH中)

arc*_*123 5 linux ksh

我有一个 KSH(不是 Bash)脚本,我想通过文件计数检查来抢占它。如果没有文件我想打印“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
Run Code Online (Sandbox Code Playgroud)

如果不为空,则有效。

如果为空,则会出现以下错误,然后系统会中断。我想让它只报告 EMPTY 并退出 0:

错误:

/nas/Opt/databox/folder/ALLSTUFF*.zip not found
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

尝试#2

我也试过这个,但我得到了相同的结果:

if [ "$(ls ${gp_path}ALLSTUFF*.zip)" ]; then
    print 'NOT EMPTY'
else
    print 'EMPTY'
    exit 0
fi
Run Code Online (Sandbox Code Playgroud)

gle*_*man 7

跟进 Stéphane Chazelas 对 Kusalananda 的回答的评论:

$ ksh
$ echo ${.sh.version}
Version AJM 93u+ 2012-08-01
$ ls
TABLE1.csv  TABLE2.csv
Run Code Online (Sandbox Code Playgroud)

使用数组来保存文件。从匹配某些文件的 glob 表达式开始:

$ typeset -a files
$ files=( ~(N)*.csv )
$ echo "${#files[@]}"
2
$ typeset -p files
typeset -a files=(TABLE1.csv TABLE2.csv)
Run Code Online (Sandbox Code Playgroud)

现在不匹配的“裸” glob 表明不匹配的 glob 被 glob 模式替换为字符串:

$ files=( *.txt )
$ echo "${#files[@]}"
1
$ typeset -p files
typeset -a files=('*.txt')
Run Code Online (Sandbox Code Playgroud)

现在使用“null glob”前缀

$ files=( ~(N)*.txt )
$ echo "${#files[@]}"
0
$ typeset -p files
(empty output)
$
Run Code Online (Sandbox Code Playgroud)

请参阅 ksh 手册页的文件名生成部分。


具体回答你的问题:

typeset -a contents=( ~(N)"$gp_path"/ALLSTUFF*.zip )
if [[ ${#contents[@]} -eq 0 ]]; then
    print 'EMPTY'
    exit 0
else
    print 'NOT EMPTY'
fi
Run Code Online (Sandbox Code Playgroud)

您应该改掉使用 ALLCAPS 变量名的习惯。

另见:https : //mywiki.wooledge.org/ParsingLs


Ste*_*ris 5

你可以用错误消息消失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
Run Code Online (Sandbox Code Playgroud)

  • 请注意,如果其中有太多文件以致于执行 `ls` 失败且参数过多,它将无法正常工作 (2认同)