假设下面的脚本中存在文件夹,有人可以告诉我为什么这不起作用?我逃避了额外的空间以使测试工作但不知何故它不喜欢它没有错误...
#!/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
答案 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在执行之前打印每个命令 - 扩展参数以准确显示正在发生的事情。