我有一个 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)
我究竟做错了什么?
我也试过这个,但我得到了相同的结果:
if [ "$(ls ${gp_path}ALLSTUFF*.zip)" ]; then
print 'NOT EMPTY'
else
print 'EMPTY'
exit 0
fi
Run Code Online (Sandbox Code Playgroud)
跟进 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
你可以用错误消息消失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)