2015-01-17 4 views
2

В обоих 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

Одна из проблемных линий:

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

Точка с запятой в конце не является необходимым, если then не находится на одной и той же линии; он, однако, безвреден.

Похоже, вы хотите выполнить команду grep и проверить, производит ли она какой-либо вывод. Однако вы просто предоставили команду test (aka [) с четырьмя строковыми аргументами (плюс закрытие ] для 5 в целом), вторая из которых не является одной из опций, признанных test.

Вы могли бы иметь в виду, чтобы использовать эту функцию:

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

(если не означало -z вместо -n, отрицаний путаете меня). Но если вы заинтересованы в найденом ли grep ничего, вы можете просто проверить статус выхода grep:

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

Хммм ... -q есть «тихий» режим; так что на самом деле строковый тест не будет работать, так как grep не производит выход. Вам нужно прямое тестирование состояния выхода, возможно, которому предшествует ! логический , а не оператор.

1

Вы не должны использовать квадратные скобки вокруг grep.

В сценариях оболочки квадратные скобки не используются для группировки, [ является команда в своем собственном праве (псевдоним для test), и это [ команда, которая жалуется, что вы дали ему слишком много аргументов.

Просто сделать звонок без скобок

if ! grep .... 
0

изменить for ы к while с с read с:

... 
echo "${files}" | while read file ; do 
    ... 
    echo "${headerfiles}" | while read header ; do 
     ... 
    done 
    ... 
done 
... 
Смежные вопросы