为什么在没有传入文件参数的情况下,dash中的test -d会直接通过且不报错?
#!/bin/sh
# dash script
zero=0
test $zero -eq 0
echo $? # prints 0
zerostr="000"
test $zerostr -eq 0
echo $? # prints 0
test
echo $? # prints 1 (as documented)
test -d
echo $? # prints 0 (but why? the unspecified directory 'exists'? wouldn't it be more consistent to print 1 instead?)
test -d $9 # what is the best way to check if an argument was indeed passed in on the command line?
echo $? # prints 0 even when $9 was not provided to the script
我有一个接收目录路径作为参数的小脚本。
我也许跳过了一些必要的参数解析代码,直接开始测试脚本要操作的预期目录和文件。
但我惊讶地发现,即使没有提供目录路径参数,该脚本还是报告找到了一个目录。
为什么一个未指定的文件在测试它是否存在且是一个目录时似乎没有报错?
这对其他人来说,这看起来像是一个错误(或至少是不一致)吗?
我在salsa上看到dash项目托管在这里:https://salsa.debian.org/debian/dash,但我还不习惯与Debian团队中的人打交道。
如果建议测试命令返回1(表示false)会被视为不良或会造成破坏吗?如果会,原因是什么?
另外,若有人愿意指点我在测试前确保所有必需的参数都已经传入,然后再测试它们的文件属性,我将不胜感激。谢谢。
解决方案
这在 POSIX test规范 中有如下说明:
用于确定运算符优先级和将要生成的返回值的算法,是基于传递给 test 的参数数量。
在下列清单中,$1、$2、$3、和 $4表示传递给 test 的参数:
0个参数:
退出值为false(1)。
1个参数:
若 $1不为空,则退出值为true(0);否则,退出值为false。
2个参数:
- 如果 $1是 '!',当 $2为空时退出true;否则,当 $2不为空时退出false。
- 如果 $1是一元原语,若一元测试为真则退出true,为假则退出false。
在 test -d 中只有一个参数且不为空,-d 只有在右侧有参数时才被视为二元运算符。你可以使用 test -d "$9"(带引号)来确保 test 在即使 $9 为空或未设置时也会被调用并传入两个参数。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。