-bash脚本中的password命令
我有一个关于bash脚本的问题: 我的剧本:-bash脚本中的password命令,bash,Bash,我有一个关于bash脚本的问题: 我的剧本: while (( $# )) ; do case "$1" in "-ip") ip="$2" shift;; "-port") port="$2" shift;; "-portstep") portstep="$2" shift;; "
while (( $# )) ; do
case "$1" in
"-ip")
ip="$2"
shift;;
"-port")
port="$2"
shift;;
"-portstep")
portstep="$2"
shift;;
"-maxplayers")
maxplayers="$2"
shift;;
"-password")
password="$2"
shift;;
"-othercommand")
othercommand="$2"
shift;;
esac
shift
done
我用以下方法运行它:
./script -ip myip -port myport -portstep myportstep -maxplayers mymaxplayers -password mypassword
这是用于gameserver Web界面的。我可以根据需要修改命令
但是现在我可以设置可以运行的不同变量,所有这些命令都将在-password
例如,现在我不会设置我运行的密码
./script -ip myip -port myport -portstep myportstep -maxplayers mymaxplayers -password -othercomamnd myothercomand
现在它会将密码设置为-othercomand
如何修改此脚本,以便在没有密码的情况下,密码变量将设置为“nothing”,以便我的脚本在没有密码的情况下正确编辑文件,并正确添加Other命令。很快,但我会将此内容放在这里,也许这对您有所帮助
while getopts 'M:U:Q:d:h' OPT; do
case $OPT in
M) server=$OPTARG;;
U) user=$OPTARG;;
Q) query=$OPTARG;;
h) hlp="yes";;
*) unknown="yes";;
esac
done
后期编辑:回到家中,根据OP请求进行更改
cat test3.sh
#!/bin/bash
while getopts 'M:p:s:m:Y:o' OPT; do
case $OPT in
M) server_ip=$OPTARG;;
p) server_port=$OPTARG;;
s) server_port_step=$OPTARG;;
m) server_max_players=$OPTARG;;
Y) server_password=$OPTARG;;
o) server_other_command=$OPTARG;;
*) unknown="yes";;
esac
done
case $server_password in
"-o")
server_other_command="${@: -1}"
server_password=""
;;
*)
server_other_command="${@: -1}"
server_password="${@: -3:1}"
;;
esac
echo "ip -> $server_ip"
echo "port -> $server_port"
echo "portSteps -> $server_port_step"
echo "max players -> $server_max_players"
echo "password -> $server_password"
echo "other command -> $server_other_command"
带密码的结果1
./test3.sh -M myip -p myport -s myportstep -m mymaxplayers -Y 123 -o asd
ip -> myip
port -> myport
portSteps -> myportstep
max players -> mymaxplayers
password -> 123
other command -> asd
没有密码的结果2
./test3.sh -M myip -p myport -s myportstep -m mymaxplayers -Y -o asd
ip -> myip
port -> myport
portSteps -> myportstep
max players -> mymaxplayers
password ->
other command -> asd
第二版:
如果上述情况没有帮助,请查看此处:
测试
$2
,查看它是空的还是以破折号开头。如果$2
以破折号开头,您就知道已经选择了下一个参数,-password
没有参数。如果没有$2
,则已到达参数列表的末尾
while (( $# )) ; do
case "$1" in
"-ip")
ip="$2"
shift;;
"-port")
port="$2"
shift;;
"-portstep")
portstep="$2"
shift;;
"-maxplayers")
maxplayers="$2"
shift;;
"-password")
password="$2"
if [[ $password = -* || $2 = "" ]]
then
password=""
else
shift
fi;;
"-othercommand")
othercommand="$2"
shift;;
esac
shift
done
如果不想设置密码,为什么要使用
-password
标志?只需从呼叫中完全删除-password
。因为其他用户只能在那里运行不回答问题的gameserver。当您不想设置密码时,为什么要使用标志设置密码?为什么不干脆将-password
完全关闭脚本的运行?因此,与其从/script>开始-密码…
至/script-密码…
转到/script
。我只能在webinterface中设置1个startscript命令,我的朋友应该只使用密码运行gameserver,而我不会使用密码运行它,因此我只能使用密码或不使用密码运行所有服务器。位这不是我将要做的事情,所以我需要一个解决方案来跳过密码,如果不设置密码,甚至将其设置为“无”,但不设置为-othercommand合法密码可以从-
开始吗?您可以使用-password”“
设置空字符串密码吗?(我假设您的“startscript”是/script….
命令?)正如我所说,我当时(现在)很匆忙。现在我从手机上登录,没有时间解释,也没有时间修改帮助。他还说这可能会有帮助,但并不是说它解决了他的问题。修改以更好地处理其参数并不困难,但仍然与OPs代码(长参数与短参数)有很大不同,并且只处理-p-o
的单一情况,因此不是一个通用的解决方案。因此,它也不允许任何密码以-o
开头。。。这不应该是一个问题…仅当其他脚本/应用程序依赖于此使用长参数时。至于以“-o”开头的传球。。。这里没有问题/test3.sh-M myip-p myport-s myportstep-M mymaxplayers-Y-o123-o asd ip->myip port->myport portSteps->myportstep max players->mymaxplayers->mymaxplayers密码->-o123其他命令->asd
True,而不是以-o
开头,只是一个-o
的文字密码。这不是什么问题。我的错误。尽管如此,它仍然对参数顺序非常敏感。因此,虽然它可能会起作用,但它在任何方面都不是一个通用的解决方案。也许OP可以这样使用它:d这不允许使用以-
开头的密码,因为没有真正的原因,因为您已经在这里处理了正确的解决方案(很糟糕,但我们会找到正确的解决方案)。传递一个空的参数已经起作用了(在这里工作,巧合的是,尽管缺少移位,因为空白参数通过下一个循环的case语句,然后移走),我只是回答OP的问题。正如您所评论的,如果您不需要密码,请不要提供-password
,但这是OP无法接受的。OP的要求使得密码不可能以破折号开头,因为我必须假设,如果下一个参数以破折号开头,则它是另一个参数,而不是密码。也许解决方案是使用一个-nopassword
参数来处理OP想要的内容。解决方案要么根本不使用-password
(被拒绝),要么总是为密码传递一个空参数,就像我在对OP和此处的评论中所说的那样。但是是的,这个和另一个答案都“解决”了问题。我只是指出了这些解决方案的局限性。