這個問題在這里已經有了答案: 如何將多個引數(包括陣列)傳遞給 Bash 中未定義順序且陣列元素可以有多個單詞的函式? (1 個回答) 4 小時前關閉。
我正在尋找一種抽象常用命令的方法:
find src app -name "*.hs" -exec grep -H "foo" \{\} \;
到 bash/zsh 函式,例如:
find $1 -exec grep -H $2 \{\} \;
上面不是一個解決方案,因為我想傳遞引數串列,例如使用給定的語法:findgrep "src -name '.hs'" "foo". 在這里,我們可以說 grep 的引數實際上將是一個單詞,然后將引數串列的其余部分傳遞給 find 但應該有一個更通用的方法?有沒有辦法部分應用 bash 函式?
提前致謝!
uj5u.com熱心網友回復:
通常,您不能這樣做,因為每個單獨的引數都只是一個常規字串;shell 沒有不同的串列型別。
要傳遞兩個“組”引數,您需要定義某種您的函式可以識別的“哨兵”。例如,
findgrep () {
args=()
for x; do
shift
[[ $x == ::: ]] && break
args =("$x")
done
find "${args[@]}" -exec grep -H "$@" {} \;
}
findgrep src -name ".hs" ::: foo
findgrep將向陣列添加引數,args直到它看到引數:::,此時它將忽略:::但停止迭代。現在您可以將args用作 的第一組引數find,并將剩下的任何內容$@用作第二組。
找到一個有效的哨兵可能很困難,因為從理論上講,實際上沒有任何字串不能成為find. 另一種方法是使用商定的全域陣列來存盤一個或兩個集合。
findgrep () {
find "${findgrepargs[@]}" -exec grep -H "$@" {} \;
}
findgrepargs=(src -name .hs)
findgrep foo
或使用 nameref 將 aribitary 陣列的名稱傳遞給函式。
findgrep () {
declare -n findargs=$1
shift
findgrep "${findargs[@]}" -exec grep -H "$@" {} \;
}
x=(src -name .hs)
findgrep x foo
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/432409.html
上一篇:在“org.springframework.beans.factory.config.BeanExpressionContext”型別的物件上找不到屬性或欄位
