Shell-Script
如何在 zsh 函式參數中添加雙引號?
我在 .zshrc 中定義了一個函式,如下所示:
fdtnxg () { find $1 -type $2 -name "$3" | xargs grep "${@:4}" }
如果我想在目前目錄中名稱以開頭的所有文件中使用
fdtnxg
grep ,我必須使用.alias mot``tt.``fdtnxg . f "tt.*" "alias mot"
我想
fdtnxg . f tt.* alias mot
直接使用,但不能。有沒有辦法讓它按我的預期工作?我試圖改變
fdtnxg
為:fdtnxg () { find $1 -type $2 -name "\"$3\"" | xargs grep "${@:4}" }
我試過這個,因為
echo "\"123\""
我得到了引號"123"
。
我認為你有兩個問題。
首先,您要防止 shell 在執行該函式時使用萬用字元。您不能通過在函式內添加引號來執行此操作,因為文件名在函式執行之前已擴展為函式的參數。為了防止文件名擴展,執行函式 as
noglob fdtnxg
,可以使用別名 (alias fdtnxg="noglob fdtnxg"
) 自動執行。二是grep的論據。我假設您希望從第四個開始的函式參數連接到 grep 的單個字元串。
"${@:4}"
, 將它們擴展為不同的單詞(就像"$@"
所有位置參數一樣)。"$*"
而是將參數連接到單個字元串。在 Zsh 中,"${*[4,-1]}"
似乎可以連接第四個和以後的參數。("${*:4}"
將它們全部連接起來並從第四個字元開始,這與 Bash 所做的不同。)如果這不起作用,您總是可以將前三個移出,然後使用"$*"
.所以要麼
fdtnxg () { find "$1" -type "$2" -name "$3" -exec \ grep -- "${*[4,-1]}" /dev/null {} + }
或者
fdtnxg () { local dir=$1 local type=$2 local name=$3 shift 3 find "$dir" -type "$type" -name "$name" -exec \ grep -- "$*" /dev/null {} + }
和
alias fdtnxg="noglob fdtnxg"
在任何情況下,您都不能像這樣通過管道
find
輸出xargs
。您需要-print0
/-0
GNU 擴展,或者在這裡更好,我們使用標準的-exec cmd {} +
find 語法(添加一個/dev/null
參數以確保grep
即使find
只找到一個文件也始終列印文件名;使用 GNUgrep
,您也可以使用該-H
選項) .