2016-11-15 32 views
1

我有一个关于要在bash命令行中使用的条件语句的结构的问题。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

问: 这是相当混乱,因为它似乎是不能被用于目录和变量的条件相同的结构。这是真的?如果是这样,那么这种差异记录在某处?

+0

我看不出与2号线的方法的任何问题,但它是安全的将变量括在双引号中(这样,如果变量的计算结果为空,就不会陷入语法问题),因此:if [-d“$ dir_full_path”];那么... – codeforester

+1

'-d'测试它的参数是否是一个目录。 '-z'测试它的参数是否为空字符串。 – Barmar

+1

你似乎已经回答了你自己的问题:**只有当变量directory_name存在时,才会调用then。**为什么你期望它对'-d $ dir_full_path'有不同的作用? – Barmar

回答

2

下面是正确使用这些命令,可以通过运行 助考发现:

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