错误消息是此问题标题中的错误消息。
看起来问题出在[ ]
内,但我不确定。
该程序的目的是获取两个参数(目录和扩展名)并删除该目录中具有该扩展名的所有文件:
count=0
for i in $1/*.$2 ; do
if [ -s $i ]
then rm $i
echo "$i deleted"
fi
done
答案 0 :(得分:2)
@ lurker的评论提供了关键指针:需要双引号才能将$i
等变量引用扩展为其值,而无需进一步解释。
[POSIX兼容,Bourne-like] shell编程的一些经验法则:
"$i"
的变量引用。
$i
的值包含空格,并且由于$i
未加引号,因此shell会将值拆分为多个标记,从而产生语法错误,因为-s
运算符只接受单个参数。*
之类的glob中的*.txt
,因为它是未加引号的,被视为通配符。
$1/*.$2
是有问题的,因为它仍然包含未加引号的变量引用 - 请参阅下一点。"$1"/*."$2"
- 变量引用双引号,但通配符(*
)未引用。
"$1/"*".$2"
,只留下未加引号的全局字符,但为了清楚起见,我选择单独引用参数引用;因为,/
和{ {1}}不受shell的解释,任何一种形式都可以使用。)如果我们把它们放在一起:
.
for i in "$1"/*."$2" ; do
if [ -s "$i" ]; then
rm "$i"
echo "$i deleted"
fi
done
,bash
和ksh
等POSIX兼容shell的共享语言:http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html zsh
。