Bash文件系统目录测试技巧

时间:2011-10-04 15:12:08

标签: bash

假设下面的脚本中存在文件夹,有人可以告诉我为什么这不起作用?我逃避了额外的空间以使测试工作但不知何故它不喜欢它没有错误...

#!/bin/bash
Base='/tmp/'
Sub='one space/another space/'
declare -a ASub
for argR in "${Sub[@]}"
    do
        Sub+=($(printf %q "$argR"))
    done
clear
echo -n $Base
if [ -d  $ExBase ]
    then
        echo "...OK"
    else
        echo "...FAIL"
fi
BaseAndSub=$Base$Sub
echo -n $BaseAndSub
if [ -d  "$BaseAndSub" ]
    then
        echo "...OK"
    else
        echo "...FAIL"
fi
exit 0

2 个答案:

答案 0 :(得分:2)

该脚本错误。 ASub已声明且从未使用过。永远不会宣布使用ExBase

我想这是主要问题:if [ -d $ExBase ]
由于ExBase为空且未设置,因此shell会看到:if [ -d ]
我本来期望语法错误,但显然shell将“-d”视为非空字符串,因此是真的。

答案 1 :(得分:0)

正如@glenn所说,这里有很多错误; ASub已声明但未使用,Sub有时用作字符串变量,有时用作数组,ExBase未经设置使用,...

然而,根本问题在于,为了处理文件名中的空格,你会经历许多不必要的(有时是破坏性的)工作,而所有必要的是在所有可能的地方使用双引号包含空格。数组非常适合存储文件名列表(每个文件名可能有空格)或命令字符串(可能在其参数中有空格),但在这种情况下,您只有一个文件名,因此不需要。添加引号(printf %q)几乎从来没有用,它只是意味着你将在名称中查找带有实际引号/转义/文件的文件。

这是我的重写,删除了无关的东西,并在几个地方添加了双引号。我还改为更标准的约定,即不在文件名中包含尾部斜杠,因此将Base和Sub放在一起"$Base/$Sub"不仅仅是"$Base$Sub"。它似乎对我很好:

#!/bin/bash
Base='/tmp'
Sub='one space/another space'
clear
echo -n "$Base"
if [ -d  "$Base" ]
    then
        echo "...OK"
    else
        echo "...FAIL"
fi
BaseAndSub="$Base/$Sub"
echo -n "$BaseAndSub"
if [ -d  "$BaseAndSub" ]
    then
        echo "...OK"
    else
        echo "...FAIL"
fi
exit 0

顺便说一句,在尝试对bash脚本进行问题排查时,使用-x选项非常有用(使用set -x,或使用#!/bin/bash -x作为你的shebang)。这使得bash在执行之前打印每个命令 - 扩展参数以准确显示正在发生的事情。