如何向自定义的zsh函数传递参数?

49
您如何向自定义zsh函数传递参数?例如:
function kill_port_proc(port) {
    lsof -i tcp:<port interpolated here>| grep LISTEN | awk '{print $2}'
}

我在网上看到很多ZSH函数的例子,但几乎没有关于如何传递参数和内插它们的内容。

2个回答

57

在定义函数时,您无法指定必需的参数。这就是为什么对我来说同时使用 function 关键字和括号 () 似乎毫无用处。

要获取传递的参数,请使用位置参数

  

位置参数提供对shell函数、shell脚本或shell本身的命令行参数的访问权限;[...]

     

参数 n,其中 n 是一个数字,是第 n 个位置参数。 参数 $0 是一个特殊情况[...]

关于 $0 位置参数:

  

用于调用当前shell的名称,或者在调用时通过 -c 命令行选项设置。

     

如果设置了 FUNCTION_ARGZERO 选项,则在进入shell函数时将 $0 设置为函数名称,在进入源脚本时将其设置为脚本名称,并在函数或脚本返回时将其重置为其先前的值。

使用您的示例:

function kill_port_proc {
    lsof -i tcp:"$1" | grep LISTEN | awk '{print $2}'
}

个人而言,我喜欢在函数定义之前至少添加函数签名来记录该函数。

然后,对于每个参数,我声明本地参数和只读参数,以防止它们被意外修改。

如果参数是必需的,则使用特殊的参数扩展形式:

  

${name?word}

     

${name:?word}

     

在第一种形式中,如果设置了name变量,或者在第二种形式中name既被设置又非空,则替换其值;

     

否则,打印word并退出shell。交互式shell返回提示符。

     

如果省略了word,则会打印一个标准消息。

以下是我如何编写您的示例:

# kill_port_proc <port>
function kill_port_proc {
    readonly port=${1:?"The port must be specified."}

    lsof -i tcp:"$port" | grep LISTEN | awk '{print $2}'
}

8
如果在声明函数时省略“()”,每次加载bash_profile文件时都会执行该函数。请注意,需保持翻译后的意思与原文一致,且不提供其他信息。 - 219CID
4
我的回答是针对 Zsh 的。使用符合 POSIX 标准的语法,以便在不同的 shell 中都可移植。 - Damien Flament
第一个表单将在什么时候被使用? - VimNing
谢谢Damien,我用这个做了这个,我很满意 :) - SumNeuron

10
my_function() {
  if [ $# -lt 2 ]
  then
    echo "Usage: $funcstack[1] <first-argument> <second-argument>"
    return
  fi

  echo "First argument: $1"
  echo "Second argument: $2"
}

使用方法

$ my_function
Usage: my_function <first-argument> <second-argument>

$ my_function foo
Usage: my_function <first-argument> <second-argument>

$ my_function foo bar
First argument: foo
Second argument: bar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接