2011-10-04 30 views
0

假设文件夹存在于下面的脚本中,有人可以告诉我为什么这不起作用吗?我逃避了额外的空间测试工作,但不知何故它不喜欢它没有错误...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 
+1

你想用这个脚本做什么? –

+0

你声明'ASub',但从不使用它。目前还不清楚在$ {Sub [@]}“'中为argR定义/初始化'Sub'数组的位置。至少经典,你需要使用'BaseAndSub =“$ Base/$ Sub”';否则,我不会写它,尽管它可能不是100%必要的(但它绝对清晰和万无一失)。如果名称有多个相邻空格,'echo -n $ BaseAndSub'会丢失它们的踪迹,其中'echo -n“$ BaseAndSub”'不会。使用双引号更宽松一点。 –

回答

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 

BTW,试图解决的bash脚本的时候,这是非常有帮助的使用-x选项(或者与set -x,或使用#!/bin/bash -x为您的家当)。这使bash在执行之前打印每个命令 - 扩展参数以准确显示发生了什么。

2

该脚本很大的错误。 ASub已声明,从未使用过。 ExBase从未声明,但使用。

我想这是主要的问题:if [ -d $ExBase ]
由于ExBase是空和取消,外壳看到这样的:if [ -d ]
我本来期望一个语法错误,但显然外壳看到“-d”只是一个非 - 空字符串,因此是正确的。

+0

我使用'set -o nounset;在我所有的Bash脚本的开始处设置-o errexit',这将导致Bash停止这样的错误,而不是让它们静静地通过。 –