在两个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
答案 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
...