gpt4 book ai didi

linux shell 在空参数上测试 `-d`

转载 作者:IT王子 更新时间:2023-10-29 01:02:49 26 4
gpt4 key购买 nike

这是代码,

x=
if [ -d $x ]; then
echo "it's a dir"
else
echo "not a dir"
fi

上面的代码给了我“it's a dir”,为什么? $x 是空的,不是吗?

最佳答案

x=
if [ -d $x ]; then

相当于:

if [ -d ] ; then

演示正在发生的事情的更简单方法是:

test -d ; echo $?

打印0 , 表明测试成功( [ 实际上是一个命令,等同于 test 除了它需要一个终止 ] 参数。)

但是这个:

test -f ; echo $?

做同样的事情。这是否意味着缺少的参数既是目录又是普通文件?

不,这意味着它没有进行那些测试。

根据 test 的 POSIX 规范命令,其行为取决于它接收到的参数数量。

参数为 0 时,它以状态 1 退出,表示失败。

对于 1 个参数,如果参数不为空,则退出状态为 0(成功),如果参数为空,则状态为 1(成功)。

有 2 个参数,结果取决于第一个参数,它可以是 ! (它反转了 1 个参数的行为),或者像 -f 这样的“一元主”或 -d , 或者是其他东西;如果是其他情况,则结果未指定。

(POSIX 还指定了超过 2 个参数的行为,但这与此问题无关。)

所以这样:

x=
if [ -d $x ]; then echo yes ; else echo no ; fi

打印“yes”,不是因为缺少的参数是目录,而是因为单个参数 -d不是空字符串。

顺便说一句,GNU Coreutils manual没有提到这一点。

所以不要那样做。如果你想测试是否$x是一个目录,用双引号括起来:

if [ -d "$x" ] ; then ...

关于linux shell 在空参数上测试 `-d`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9425663/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com