Bash 条件的结构 - 变量与目录

Posted

技术标签:

【中文标题】Bash 条件的结构 - 变量与目录【英文标题】:Structure of Bash conditional - variable versus directory 【发布时间】: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 的每个选项都会检查特定的内容,并且文档会准确地告诉您它要查找的内容。没有任何逻辑可以使它们彼此相似。 【参考方案1】:

这里是这些命令的正确使用方法,可以通过运行找到 帮助测试

if [ -z "$j" ]
then
  echo '$j is empty'
fi

if [ -n "$j" ]
then
  echo '$j is not empty'
fi

if [ -d /mnt/iso ]
then
  echo '/mnt/iso is a directory'
fi

【讨论】:

以上是关于Bash 条件的结构 - 变量与目录的主要内容,如果未能解决你的问题,请参考以下文章

bash 中 if 判断条件,控制结构

bash编程-循环控制的结构

3-unit12 脚本2

Shell脚本的条件测试与比较

玩转Bash脚本:选择结构之case

4.Linux根文件系统和目录结构及bash特性