2012-07-17 57 views
0

我正在编写一个批处理脚本bash,需要先检查是否存在一个文件夹以知道是否运行某个将创建并填充夹。我之前做过类似的事情,在改变目录和从存储变量中查找目录方面做得很好,但由于某种原因,我只是在这里丢失了一些东西。在bash shell脚本中检查目录的问题

下面大致介绍脚本的工作原理。

if [ -d "$net_output" ] 
then 
    echo "directory exists" 
else 
    echo "directory does not exist" 
fi 

当我运行这个脚本时,我通常会在前面的行中回显$ net_output,看看它会评估什么。当脚本运行时,我得到我的代码块说“目录不存在”,但是当我然后复制粘贴之前回显的$ net_output目录路径到shell终端中时,它改变目录就好了,证明目录确实存在。我在戴尔机器上使用Ubuntu 12.04。

非常感谢您提供任何帮助。让我知道我可以提供什么额外的信息。

+1

你确定你已经获得'$ net_output'的预期值吗?有没有可能它的值是一个你不在的目录的相对路径?代码本身似乎很好,所以我会检查这个值,以确保它是你期望的 – Cfreak 2012-07-17 16:12:51

+1

另一种可能性是它实际上是一个目录的符号链接,在这种情况下'cd'可以工作,但是'[-d .. 。]'将返回false ... – twalberg 2012-07-17 16:22:38

+0

@twalberg:测试必须成功获得有效的符号链接。从标准:'除-h路径名和-L路径名初选外,如果路径名参数是符号链接,则测试应通过解析符号链接并使用链接引用的文件来评估表达式。' – 2012-07-17 17:41:52

回答

2

当有人张贴这样的问题,我遇到的最常见的情况有以下几种:

的变量包含文字引号。 Bash不会递归地解析引号,它只解析命令行给出的“外层”引号。

$ mkdir "/tmp/dir with spaces" 
$ var='"/tmp/dir with spaces"' 
$ echo "$var" 
"/tmp/dir with spaces" 
$ [ -d "/tmp/dir with spaces" ]; echo $? 
0 
$ [ -d "$var" ]; echo $? # equivalent to [ -d '"/tmp/dir with spaces"' ] 
1 

2.变量包含相对路径和当前目录是不是你所期望的。检查echo "$PWD"的值是否符合您的预期。

3.该变量是从一个文件中读取的,该文件的结尾为CRLF(\ r \ n)。 Unix和类Unix系统仅使用LF(\ n)作为行尾。如果是这样的话,路径最后会包含一个CR(\ r)。终点处的CR将在终端中“不可见”。在调试脚本时与printf '%q\n' "$var"进行检查。请参阅BashFAQ 52关于如何摆脱它们。