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 条件的结构 - 变量与目录的主要内容,如果未能解决你的问题,请参考以下文章