Shell-Script

如何在 zsh 函式參數中添加雙引號?

  • July 22, 2019

我在 .zshrc 中定義了一個函式,如下所示:

fdtnxg () {
   find $1 -type $2 -name "$3" | xargs grep "${@:4}"
}

如果我想在目前目錄中名稱以開頭的所有文件中使用fdtnxggrep ,我必須使用.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/ -0GNU 擴展,或者在這裡更好,我們使用標準的-exec cmd {} +find 語法(添加一個/dev/null參數以確保grep即使find只找到一個文件也始終列印文件名;使用 GNU grep,您也可以使用該-H選項) .

引用自:https://unix.stackexchange.com/questions/531282