2017-04-07 80 views
0

第一個參數文件包含給定的話,其餘都是其他目錄其中我在尋找的文件,至少包含3的話第一個參數我要檢查,如果某個給定的文件包含一個shell腳本的輸入文件的更多然後3個字

我可以成功打印輸出的匹配單詞數,但是當測試,如果它是大於3它給了我錯誤test: too many arguments

這裏是我的代碼:

#!/bin/bash 

file=$1 
shift 1 

for i in $* 
do 
    for j in `find $i` 
    do 
     if test -f "$j" 
     then 
      if test grep -o -w "`cat $file`" $j | wc -w -ge 3 
      then 
       echo $j 
      fi 
     fi 
    done 


done 

回答

1

首先,您需要執行的grep | wc,然後將輸出與3進行比較。您需要更改if語句。既然你已經在使用反引號,你不能嵌套的,所以你可以用其他的語法$(命令),這相當於`command`:

if [ $(grep -o -w "`cat $file`" $j | wc -w) -ge 3 ] 
then 
    echo $j 
fi 
+0

順便說一句:我沒有檢查你的代碼的邏輯,只是你得到太多的參數錯誤的原因。 – kontiki

1

我相信你的問題是,你正在嘗試得到grep -o -w " cat $文件" $j | wc -w的結果,看看它是大於還是等於三,但是你的語法不正確。試試這個:

if test $(grep -o -w "`cat $file`" $j | wc -w) -ge 3 

通過將$()內的grep & WC命令,shell將執行這些命令,並使用輸出,而不是命令本身的文本。試想一下:

> cat words 
western 
found 
better 
remember 

> echo "cat words | wc -w" 
cat words | wc -w 

> echo $(cat words | wc -w) 
4 

> echo "cat words | wc -w gives you $(cat words | wc -w)" 
cat words | wc -w gives you 4 

> 

注意,$()語法相當於你已經使用了cat $file命令雙反引號標記。

希望這會有所幫助!

1

您的代碼可以在幾個地方重構和糾正。

有這樣說:

#!/bin/bash 

input="$1" 
shift 

for dir; do 
    while IFS= read -r d '' file; do 
     if [[ $(grep -woFf "$input" "$file" | sort -u | wc -l) -ge 3 ]]; then 
      echo "$file" 
     fi 
    done < <(find "$dir" -type f -print0) 
done 
  • for dir遍歷所有參數
  • 使用sort -u是從grep輸出刪除重複的話。
  • Use wc -l instead of wc -w since grep -o`在單獨的行中打印匹配的單詞。
  • find ... -print0是照顧可能有空格的文件。
  • find ... -type f將檢索僅文件,並避免稍後檢查-f
相關問題