2013-02-09 114 views
0

當使用下列內容:循環輸入中有多個變量?

for what in [email protected]; do 
read -p "Where?" where 
grep -H "$what" $where -R | cut -d: -f1 

我如何,而不是使用讀來定義一個用戶變量,調用腳本的時候有第二個變量輸入與第一變量一起。

例如,理想的使用,我相信我能得到的是這樣的:

sh scriptname var1 var2 

但我的理解是,對...行是循環的後續entires到一個變量;我需要更改輸入多個變量?

+0

那麼你想訪問傳遞給腳本的命令行參數嗎? – 2013-02-09 22:42:58

+0

是的,謝謝;我似乎無法表達我在做什麼。例如,我希望能夠將第一個參數傳遞給第一個變量位置,第二個等等。 – 2013-02-09 22:44:18

回答

2

順便說一句:使用| cut -D: -f1並不安全,因爲grep的不逃避在文件名中的冒號。看看我的意思,你可以試試這個:

[email protected]:~$ echo bar:baz > foo 
[email protected]:~$ echo baz > foo:bar 
[email protected]:~$ grep -Hr ba . 
./foo:bar:baz 
./foo:bar:baz 

明確..沒有。

所以...讓我們澄清你在找什麼。

  1. 是否要在多個文件中搜索一個字符串?或者,
  2. 是否要在一個文件中搜索多個字符串?

如果是前者,那麼下面可能的工作:

#!/bin/bash 

if [[ "$#" -lt 2 ]]; then 
    echo "Usage: `basename $0` string file [file ...] 
    exit 1 
fi 

what="$1" 
shift  # discard $1, move $2 to $1, $3 to $2, etc. 

for where in "[email protected]"; do 
    grep -HlR "$what" "$where" -R 
done 

而如果是後者,那麼這將是這樣:

#!/bin/bash 

if [[ "$#" -lt 2 ]]; then 
    echo "Usage: `basename $0` file string [string ...] 
    exit 1 
fi 

where="$1" 
shift 

for what in "[email protected]"; do 
    grep -lR "$what" "$where" 
done 

當然,這其中可能會被精簡如果你用一個或者一個條連接你的字符串,然後使用egrep。取決於你實際尋找的東西。

+0

我應該澄清:目的是在給定目錄中搜​​索指定字符串存在匹配的文件,其中輸出只是字符串存在的文件名。感謝您的小費;考慮到這一點,我會做出一些改變,但我想我或多或少地找到了我想要的東西。 – 2013-02-09 23:02:47

+0

那麼......單個目錄和單個文件? '$ @'來到哪裏? – ghoti 2013-02-09 23:26:12

+0

那麼,我或多或少只是重新使用了一個我以前的腳本中使用過的東西,我錯誤地理解了它的目的;在任何情況下,我都希望替換$ @部分,並且我能夠對此問題使用其他答案。我很抱歉我之前對這個問題的解釋。 – 2013-02-09 23:31:03

2

你可以得到的參數在命令行上通過與$1$2

定位參數讀了起來:http://www.linuxcommand.org/wss0130.php。你不需要for循環來解析它們。

sh scriptname var1 var2 

v1=$1 # contains var1 
v2=$2 # contains var1 

[email protected]基本上是一個所有的位置參數的清單:$1 $2 $3

+0

謝謝,這正是我所需要的。 – 2013-02-09 22:56:34