String &引用;测试:参数太多“;消息,因为在bash上使用test命令比较两个字符串时使用了特殊字符*
我不熟悉shell脚本,在使用“test”命令和特殊字符*比较两个字符串时遇到了一些问题 我必须编写一个shell脚本,对于作为第一个参数传递的目录中包含的每个元素(包括文件和目录),该脚本必须在文件“summary.out”上写一些东西(为了解决我的问题,不需要知道必须写什么)。此外,还有一个字符串作为第二个参数传递。必须忽略以该字符串开头的文件/目录(不必在summary.out上写入任何内容) 代码如下:String &引用;测试:参数太多“;消息,因为在bash上使用test命令比较两个字符串时使用了特殊字符*,string,bash,shell,command,String,Bash,Shell,Command,我不熟悉shell脚本,在使用“test”命令和特殊字符*比较两个字符串时遇到了一些问题 我必须编写一个shell脚本,对于作为第一个参数传递的目录中包含的每个元素(包括文件和目录),该脚本必须在文件“summary.out”上写一些东西(为了解决我的问题,不需要知道必须写什么)。此外,还有一个字符串作为第二个参数传递。必须忽略以该字符串开头的文件/目录(不必在summary.out上写入任何内容) 代码如下: #!/bin/bash TEMP=NULL cd "$1" for i in *
#!/bin/bash
TEMP=NULL
cd "$1"
for i in *
do
if test "$i" != "$2"*;then #Here is where the error comes from
if test -f "$i";then
TEMP="$i - `head -c 10 "$i"`"
elif test -d "$i";then
TEMP="$i - `ls -1 "$i" | wc -l`"
fi
echo $TEMP >> summary.out
fi
done
错误来自测试,该测试检查当前文件/目录是否以作为第二个参数传递的字符串开头,并且在for循环的每次迭代中都会发生。它说:“测试:参数太多”
现在,我执行了一些测试,结果表明问题与$I或$1中的空格无关。这个问题与我在测试中使用特殊字符*有关(如果我删除它,一切正常)
为什么不能“测试”处理*?我能做些什么来解决这个问题?
*
被shell扩展
在bash中,可以对条件使用[…]
,而不是测试。它们支持右侧的模式-*
未展开,因为双方括号是具有更高优先级的关键字
if [[ a == * ]] ; then
echo Matches
else
echo Doesn\'t match
fi
您可以使用done>summary.out
而不是>summary.out
来避免在循环中重复打开和关闭文件。echo是一个内置的,而且echo*
肯定会扩展,这个答案很容易误导。@JID:对不起,s/builtin/keyword/
。修正了。它仍然有误导性。
*没有扩展,因为它是一个要测试的参数(同时FWIW测试也是一个bultin)。除非先解释具有更高优先级的其他内容(例如”
”或[[]]]
),然后阻止它这样做,否则它会一直用任何内容展开。作为if
的参数,另一个关键字,它将像其他任何东西一样展开。@JID:keywords可以决定如何处理*
,但命令不能。是的,因为正如我所说的,它们首先被解析,但你不能说在你的回答中,你已经做出了误导性的笼统陈述。我从来没有说过有什么不对,只是你的回答有误导性。