String &引用;测试:参数太多“;消息,因为在bash上使用test命令比较两个字符串时使用了特殊字符*

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 *

我不熟悉shell脚本,在使用“test”命令和特殊字符*比较两个字符串时遇到了一些问题

我必须编写一个shell脚本,对于作为第一个参数传递的目录中包含的每个元素(包括文件和目录),该脚本必须在文件“summary.out”上写一些东西(为了解决我的问题,不需要知道必须写什么)。此外,还有一个字符串作为第二个参数传递。必须忽略以该字符串开头的文件/目录(不必在summary.out上写入任何内容)

代码如下:

#!/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可以决定如何处理
*
,但命令不能。是的,因为正如我所说的,它们首先被解析,但你不能说在你的回答中,你已经做出了误导性的笼统陈述。我从来没有说过有什么不对,只是你的回答有误导性。