我有以下bash脚本:
export USER_AT_HOST="<user@ipaddress>"
export PUBKEYPATH="$HOME/.ssh/<pubkeyfilename>"
ssh-copy-id -i "$PUBKEYPATH" "$USER_AT_HOST" -p 8524
我想修改脚本,以便
<pubkeyfilename>
(当前已在脚本中硬编码),成为命名输入参数,端口号也是如此。理想情况下,脚本应该执行以下操作
-
以两个命名的参数为例,
-p/--port
和
--pubkeyfile
,分别为整数和路径
-
执行输入验证,即检查
-p/--端口
是一个整数,如果不是空的话
--pubkeyfile
这是一根绳子。当然,如果这在bash中不可能或太复杂,可以忽略此请求。
-
如果未传递参数,请使用默认值
-
如果一个错误的论点或论点
-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
,虽然不理想,但可以接受。