2016-06-29 122 views
0

您是否可以將命令作爲變量傳遞給另一個函數?如果是,那麼語法是什麼?將命令作爲變量傳遞給Unix中的函數

我的代碼看起來像這樣。

function1(){ 

for a in $1 
do 
    echo $a 
done 
} 

function2(){ 

function1 "ls -lrt folder/Name | grep 'foo' | grep 'bar'" 

} 

但這不起作用。我甚至嘗試把它當作:

function1 `ls -lrt folder/Name | grep 'foo' | grep 'bar'` 

但這僅傳遞命令的第一個值(和我理解爲什麼會這樣)。

有誰知道傳遞命令作爲變量的語法的語法?

+1

當你在'function1'中說'for a $ 1'時,這意味着你剛剛通過第一個參數。如果你想遍歷所有的參數,你需要使用'$ @'。 – fedorqui

+0

上面的評論是正確的,你也可以忽略for循環,只是做'echo @ a' - 如果你打算只傳遞一個字符串/函數 – Vaelor

+0

我試過了,它的工作原理!非常感謝! :) – user2882388

回答

0

如註釋中所示,您使用的是$1,但這隻包含第一個參數。相反,您需要使用[email protected]

Bash Manual → 3.4.2 Special Parameters

$ @

($ @)展開爲位置參數,從1開始。當在雙引號內出現 擴展時,每個參數都會擴展爲單獨的單詞 。也就是說,「$ @」相當於「$ 1」「$ 2」...。如果 雙引號擴展出現在單詞中,則將 第一個參數的擴展連接到原始單詞 的開頭部分,並將最後一個參數的擴展連接到原始單詞的最後一個 部分。當沒有位置參數時, 「$ @」和$ @展開爲空(即,它們被移除)。

然後你問

如果有什麼期函數有多個參數?並且命令是 第三個參數被傳遞,然後使用$ @需要一些 不必要的值。我如何從3美元起獲取價值?

對於這一點,你要使用shift

$ cat myscript.sh 
#!/bin/bash 
shift 2 

echo "[email protected]" 
$ ./myscript.sh a b c d 
c d 

轉變

shift [n] 

移位置參數由n個離開了。位置 來自n + 1 ... $#的參數被重新命名爲$ 1 ... $#-n。由數字$#到$# - n + 1表示的參數 未設置。 n必須是小於或等於$#的非負數 。如果n等於或大於$#0,則位置參數不會改變。如果提供n不是 ,則假定爲1.返回狀態爲零,除非n是 大於$#或小於零,否則爲非零。