该脚本名为isFile.sh,如下所示:
#!/bin/sh 回声 $1 回声 $2 如果 [ !-f $1 ]; 然后 echo "$1 (arg1) 不是文件" 菲 如果 [ !-f $2 ]; 然后 echo "$2 (arg2) 不是文件" 菲
首先,我通过执行touch file.exist
.
我跑了bash isFile.sh file.exist file.notexist
输出是:
文件存在
文件不存在
file.notexist (arg2) 不是文件
然后我跑了bash isFile.sh "" file.notexist
输出是:
(#空行)
文件不存在
file.notexist (arg2) 不是文件
预期输出为:
(#空行)
文件不存在
(arg1) 不是文件
file.notexist (arg2) 不是文件
有人可以解释为什么吗?
问题是扩展后[ ! -f $1 ]
变成了[ ! -f ]
(而不是[ ! -f "" ]
你想的那样!),所以如果检查给定文件是否存在,[
检查-f
字符串是否为空。它不是空的,但由于!
最终的退出代码是1
,因此echo
不会执行该命令。
这就是为什么您需要在 POSIX shell 中引用变量的原因。
相关问题: