在bash shell脚本中检查目录的问题

时间:2012-07-17 16:08:04

标签: bash shell ubuntu batch-file

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

以下是脚本的工作原理。

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

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

提前感谢您提供任何帮助。让我知道我可以提供哪些其他信息。

1 个答案:

答案 0 :(得分:2)

当有人发布此类问题时,我遇到的最常见情况如下:

1。该变量包含文字引号。 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. 从具有dos行结尾的文件CRLF(\ r \ n)读取变量。 Unix和unix类系统只使用LF(\ n)作为行结尾。如果是这种情况,路径将在末尾包含CR(\ r)。一行末尾的CR将在终端中“不可见”。调试脚本时请检查printf '%q\n' "$var"。请参阅BashFAQ 52了解如何摆脱它们。