判断文件是否存在,通配符文件匹配发生错误 binary operator expected

本文介绍在Shell脚本中如何正确地检查文件是否存在,特别是针对使用通配符匹配多个文件的情况。通过对比不同的方法,展示了如何避免常见的错误,并提供了一种可靠的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

if [ -f `ls /tmp/sql/*.sql` ];
then
echo '找到匹配的sql文件'
else
echo "sql文件不存在"
fi
-bash: [: /root/sql/11.sql: binary operator expected
if [ -f `ls /tmp/sql/*.sql` ];这句报错-bash: [: /tmp/sql/112.sql: binary operator expected
找了半天错误,最后发现,-f后面根本是不能跟通配符,或者说可以跟通配符,但是除非只有一个文件被匹配上不会报错。
遂使用if [ -n "ls /tmp/sql/*.sql" ];来判断,意思是ls命令列出通配符匹配的文件,
存在返回true,这个在文件存在的时候是没问题,但是如果不存在,就会报错而不是返回false:No such file or directory
然后去查,发现有人遇到过一个一样的问题, 解决办法是把标准错误重定向到正确输出,使用
if [ -n "ls /tmp/sql/*.sql >/dev/null 2>&1" ] (网上的解决办法)
if [ -n "`find /tmp/sql -maxdepth 1 -name '*.sql'`" ] (我的解决办法)

linux启动后,会默认打开3个文件描述符,分别是:
标准输入standard input 0,
正确输出standard output 1,
错误输出error output 2。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值