在两个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

最佳答案

问题行之一是:

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不产生任何输出。您需要直接测试退出状态,可能在后面测试!逻辑而非运算符。

关于linux - 的争论太多,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28002797/

10-16 18:08