太多的论据了

时间:2015-01-17 18:26:29

标签: linux bash ubuntu

在两个for语句中,我收到以下错误:

./count_files.sh: line 21: [: too many arguments
./count_files.sh: line 16: [: too many arguments.

任何人都可以帮助我吗?

#!/bin/bash



files=($(find /usr/src/linux-headers-3.13.0-34/include/ -type f -name '[aeiou][a-z0-9]*.h'))
count=0


headerfiles=($(find /usr/src/linux-headers-3.13.0-34/include/ -type f -name '[_a-zA-Z0-9]*.h' | grep -v "/linux/"))




for file in "${files[@]}" 
do
    if ! [ grep -Fxq "linux/err.h" $file ];
    then 
        localcount=0
        for header in "${headerfiles[@]}" 
        do
            if [ grep -Fxq $header $file ];
            then 
                localcount=$((localcount+1))
                if [ $localcount -eq 3 ];
                then
                    count=$(($count+1))
                    break
                fi
            fi
        done
        localcount=0
    fi
done

echo $count

3 个答案:

答案 0 :(得分:3)

其中一个问题是:

if ! [ grep -Fxq "linux/err.h" $file ];

除非then在同一条线上,否则最后的分号是不必要的;然而,它是无害的。

看起来好像要执行grep命令并检查它是否产生任何输出。但是,您只是提供了test(又名[)命令,其中包含四个字符串参数(加上结束]共5个),其中第二个不是其中之一test识别的选项。

您可能打算使用此功能:

if ! [ -n "$(grep -Fxq "linux/err.h" "$file")" ]

(除非你的意思是-z而不是-n;否定让我感到困惑。但是,如果您对grep是否找到任何内容感兴趣,可以直接测试grep的退出状态:

if grep -Fxq "linux/err.h" "$file"

嗯... -q是'安静'模式;所以实际上字符串测试不起作用,因为grep不产生输出。您希望直接测试退出状态,可能先于!逻辑而不是运算符。

答案 1 :(得分:1)

您不应在grep周围使用方括号。

在shell脚本中,方括号不用于分组,[本身就是一个命令(test的别名),而[命令正在抱怨你给了它太多的论据。

只需拨打无括号的电话

if ! grep ....

答案 2 :(得分:0)

使用for s将while更改为read

...
echo "${files}" | while read file ; do
    ...
    echo "${headerfiles}" | while read header ; do
        ...
    done
    ...
done
...