我有一个 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
跟进 Stéphane Chazelas 对 Kusalananda 的回答的评论:
$ 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
类似的 shell 中使用。