【发布时间】:2017-03-28 19:00:26
【问题描述】:
我有一个关于要在 bash 命令行中使用的条件语句的结构的问题。
This question 显示:
if [ -z "${VAR}" ]; then echo "VAR is unset or set to the empty string"
在这里,then 似乎只在变量VAR 不存在 存在时被调用。这是从here 确认的。
但是,对于目录,this question 显示:
if [ -d $directory_name ]; then echo "Directory already exists"
在这里,then 似乎仅在变量 directory_name 确实 存在时才被调用。这是从here 确认的(向下滚动到-d)。
我的问题: 我最近尝试检查是否为variable existed or not。当我尝试将相同的逻辑应用于目录时,我很惊讶它无法完成。这是我尝试过的:
dir_full_path='/mnt/iso'
if [ -d $dir_full_path ]; then echo 'Directory does not exist'; else echo 'Does exist'; fi
当我运行这两行时,目录路径/mnt/iso 确实不存在。所以我希望条件返回Directory does not exist。相反,它做了相反的事情,它返回了Does exist。
问题: 这很令人困惑,因为条件 不能 的相同结构似乎不能用于目录和变量。这是真的?如果是这样,那么这种差异是否记录在某处?
【问题讨论】:
-
我没有看到 2 行方法有任何问题,除了用双引号将变量括起来更安全(这样如果变量计算为什么都没有),因此: if [ -d "$dir_full_path" ];然后...
-
-d测试其参数是否为目录。-z测试其参数是否为空字符串。 -
您似乎已经回答了您自己的问题:只有在变量 directory_name 确实存在时才会调用 then。 为什么您希望它对
-d $dir_full_path的工作方式有所不同? -
我认为这让我感到困惑。
-z正在检查空字符串。我认为-d类似地意味着空目录(即目录不存在)。我在设置条件时使用了这个逻辑,这就是给我带来问题的原因。感谢您的上述评论。它帮助了我。 -
test的每个选项都会检查特定的内容,并且文档会准确地告诉您它要查找的内容。没有任何逻辑可以使它们彼此相似。
标签: bash shell conditional