代码之家  ›  专栏  ›  技术社区  ›  DeltaIV

将命名参数传递给bash脚本,带有默认参数选项和帮助方法

  •  0
  • DeltaIV  · 技术社区  · 4 年前

    我有以下bash脚本:

    export USER_AT_HOST="<user@ipaddress>"
    export PUBKEYPATH="$HOME/.ssh/<pubkeyfilename>"
    ssh-copy-id -i "$PUBKEYPATH" "$USER_AT_HOST" -p 8524
    

    我想修改脚本,以便 <pubkeyfilename> (当前已在脚本中硬编码),成为命名输入参数,端口号也是如此。理想情况下,脚本应该执行以下操作

    1. 以两个命名的参数为例, -p/--port --pubkeyfile ,分别为整数和路径
    2. 执行输入验证,即检查 -p/--端口 是一个整数,如果不是空的话 --pubkeyfile 这是一根绳子。当然,如果这在bash中不可能或太复杂,可以忽略此请求。
    3. 如果未传递参数,请使用默认值
    4. 如果一个错误的论点或论点 -h/--help 通过后,将显示一条帮助消息

    这个答案备受推崇:

    https://stackoverflow.com/a/14203146

    但它没有显示在参数未传递时如何使用默认值,也没有执行输入验证,也没有包含帮助方法。另外,对于 getopts 选项(不允许我使用长选项名),它指的是本教程

    https://wiki.bash-hackers.org/howto/getopts_tutorial

    但这给了我一个错误

    This site can’t provide a secure connection
    wiki.bash-hackers.org sent an invalid response.
    ERR_SSL_PROTOCOL_ERROR
    

    编辑 :这个问题是 复制品 How can I use long options with the Bash getopts builtin? ,因为那里的答案要么没有显示如何使用getops进行长选项(请参见 https://stackoverflow.com/a/12026302/1711271 )或者不演示如何传递需要参数的长选项( https://stackoverflow.com/a/30026641/1711271 ),或不显示如何为未传递的选项(所有选项)设置默认值。我的操作系统是MacOS。

    编辑2 :我的外壳是bash:

    > ps -p $$
      PID TTY           TIME CMD
    67809 ttys001    0:00.01 -bash
    

    我不会为了一个简单的脚本而学习另一个shell。 然而 ,如果我理解正确,可以编写一个运行另一个shell的shell脚本,然后终止。因此基于一个解决方案 zsh ,虽然不理想,但可以接受。

    0 回复  |  直到 4 年前
    推荐文章