2014-12-18 124 views
1

我將一個變量傳遞給從配置文件加載的函數。這個變量反過來傳遞給一個grep。我已經嘗試了幾種方法來擴展搜索變量($ 1),但似乎沒有任何工作,但要搜索的文件工作正常($ 2)。變量傳遞給函數的grep

有人可以告訴什麼是正確的方式呈現變量的grep函數。我曾嘗試 「$ 1」, 「$ {1}」,$ 1,$ {1},「$ {!1}基於答案

UPDATE我已經更新了script.sh到refelect實際腳本複雜性,因爲它仍然無法正常工作。

感謝 藝術

工作代碼不變量RouteTableId

MyVar=$(grep -m 1 "RouteTableId" $2) 

不工作代碼變量RouteTableId

config.file

myTerm="RouteTableId" 
myFile="my.file" 

script.sh

. config.file 
myFunction(){ 
    mySubFunction(){   
     myVar=$(grep -m 1 "$1" $2) 
     echo $myVar 
    } 
    mySubFunction ${!1} ${!2} 
} 
myFunction "myTerm" "myFile" 

UPDATE 我已經做了一些測試,它原來當在fu之間傳遞變量的時候在某些情況下,如果其中一個序列爲空,則編號順序會改變。例如,如果我打電話myFunction的與下文中,將第二變量被空

myFunction "myTerm" "blah" "myFile" 

然後myFunction的將看到以下

echo "${!1}, ${!2}, ${!3}" 
RouteTableId,,my.file 

,然後使這對mySubFunction

mySubFunction ${!1} ${!3} 

從給within mySubFunction

echo "${!1}, ${!2}, ${!3}" 
RouteTableId,my.file, 

所以它看起來在命令中刪除了空值,隨後的變量以數字順序被提前。 如果有人可以驗證並解釋爲什麼我會感激它。

THX 藝術

+0

使用這一個「$ 1」 – tinySandy 2014-12-18 22:32:30

+1

@Ed,很高興我能帶來一些新的傑出的職業生涯:)。是的,有幾個子功能在其他處理選項上被調用。快樂的節日! – 2014-12-18 22:56:18

+0

@artvanderlay你確定你可以使用這樣的子函數?不是100%,但很確定你不能在函數中聲明一個函數。即使你可以,但我認爲最好是將它們聲明爲單獨的函數,然後只需在另一個包括電話。 – 2014-12-19 00:11:57

回答

3

你是不是傳遞值的變量,但變量名稱本身的價值

myFunction "myTerm" "myFile" 

應該

myFunction "$myTerm" "$myFile" 
+0

是的,你是正確的,所以我更新了我的Q,以反映更多的複雜性。 thx藝術 – 2014-12-18 22:49:51

2

如果這是你期望的,你應該修改你的問題,以更好地定義什麼是你做的期望不是:

$ cat my.file 
foo 
Here it is: RouteTableId 
bar 
$ 
$ cat config.file 
myTerm="RouteTableId" 
myFile="my.file" 
$ 
$ cat script.sh 
. config.file 
myFunction() { 
    mySubFunction() { 
     myVar=$(grep -m 1 "$1" "$2") 
     echo "$myVar" 
    } 
    mySubFunction "${!1}" "${!2}" 
} 
myFunction "myTerm" "myFile" 
$ 
$ ./script.sh 
Here it is: RouteTableId 

從最近的更新,我覺得你對$1等意味着什麼感到困惑。在shell腳本中,除了任何函數外,$1是傳遞給shell腳本的第一個參數。在shell腳本中的函數中,$1是傳遞給該函數的第一個arg,而不是傳遞給shell腳本的第一個arg。所以,如果你這樣做:

func() { 
    echo "$1,$2,$3" 
} 
func "$1" "$3" 

那麼你會得到傳遞給腳本的第一個參數的值(因爲這也是傳遞給函數的第一個ARG),然後一個逗號,然後傳遞到第三個參數該腳本(因爲這是第二個參數傳遞給函數),然後是另一個逗號,這是全部(因爲沒有第三個參數傳遞給函數)。

希望是有道理的。

+0

感謝您的幫助。基於你對以前的帖子的一些想法,我開始回顧實際的代碼,因爲它更復雜。你可以看到我的發現更新。爲了您的幫助,我已經以您的名義向人類基金會捐款 - 在這個節日期間爲人民捐款。 – 2014-12-19 00:01:53

+0

我沒有在任何地方看到您的更新,但感謝您的捐贈。不過,我會重新將它改爲製作更安全的郵票膠水。 – 2014-12-19 00:05:39

+0

我現在看到您的更新。看起來問題只是你沒有引用你的變量。調皮......使用'「$ {!1}」'而不是'$ {!1}'。另外,當你調用'func「$ 1」「$ 3」',然後'func'時,第二個參數(即'$ 2')就是你從調用代碼中的$ 3'提取的值,所以如果這不是你想要的,不要那樣做! – 2014-12-19 00:14:02