"test: too many arguments"消息,因为特殊字符 * 在 bash 上使用测试命令比较两个字符串



我是新来的shell脚本,我在使用" test"命令和特殊字符 *比较两个字符串时遇到了一些麻烦。

我必须编写一个shell脚本,该脚本对于第一个参数传递的目录中包含的每个元素(文件和目录),必须写一些东西(对于解决我的问题,知道什么是无关紧要的在文件" 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 Cycle的每一个迭代中。它指出:"测试:太多参数"

现在,我进行了一些测试,这些测试表明问题与$ i或$ 1的空白无关。问题与我在测试中使用特殊字符 *的事实有关(如果我删除它,一切正常)。

为什么不能"测试"句柄 *?我该怎么办才能解决?

*被外壳展开。

在Bash中,您可以使用[[ ... ]]在条件上而不是test。它们支持右侧的模式-*未扩展,因为双方括号是具有更高优先级的关键字。

if [[ a == * ]] ; then
    echo Matches
else
    echo Doesn't match
fi

最新更新