#!/bin/bash
dir=/home/john
name="kate"
if [ -d $dir ] && [ -n $name ]; then
echo "The name exists and the folder $dir exists."
else
echo "Fail"
fi
我只是执行了这个命令,它根本不起作用。只有当两个测试都成功时,此命令才应返回 true,否则它将失败。但没有什么是失败的。
为什么?
先感谢您。
#!/bin/bash
dir=/home/john
name="kate"
if [ -d $dir ] && [ -n $name ]; then
echo "The name exists and the folder $dir exists."
else
echo "Fail"
fi
我只是执行了这个命令,它根本不起作用。只有当两个测试都成功时,此命令才应返回 true,否则它将失败。但没有什么是失败的。
为什么?
先感谢您。
如果
$dir
or$name
为空,则[ -d $dir ]
or[ -n $name ]
将评估为 TRUE,因为它们变为[ -d ]
and[ -n ]
which test for non-zero length of literal strings-d
and-n
,如对此相关问题的答案中更详细的讨论:前任。
所以你应该使用
但是,如果您想知道该文件
$dir/$name
是否存在,您应该通过一次测试来做到这一点如@bac0n 的评论中所述
让我也试一试。现有的答案是正确的,但由于这是一个 Bash 问题,我可以建议使用 Bashism 吗?
您可以看到内联评论。我还删除了多余的空行。
要点是我使用的是
[[
代替[
(以及相应的对应物]]
代替]
)。作为参考,您可能需要阅读
help [
and的输出help [[
。简而言之,这[[
是一个扩展版本,它还提供正则表达式支持,并且在许多其他情况下更智能。我已经养成了使用它的习惯,而不是[ expression ]
每当我被允许放弃与普通 POSIX shell 的兼容性时。我不确定这是否可以正确地称为“错误”(缺陷)。我认为这可能是由于向后兼容性。但我不能 100% 确定所谓的“错误”行为是否真的被编入了 POSIX 标准左右。
作为进一步的观点:
id
orgetent passwd
(以可用且更适合您想要的为准)。您也可以使用eval echo ~$name
(如果$name
包含用户名)。不,这不是一个错误。~username
扩展到所述用户的主目录,但只能通过 (或提示符上的选项卡完成)的帮助eval
。getent passwd
输出而不是硬编码假设,例如主目录应该在/home
...但这只是我额外的两分钱......;)