-bash脚本中的password命令

-bash脚本中的password命令,bash,Bash,我有一个关于bash脚本的问题: 我的剧本: while (( $# )) ; do case "$1" in "-ip") ip="$2" shift;; "-port") port="$2" shift;; "-portstep") portstep="$2" shift;; "

我有一个关于bash脚本的问题:

我的剧本:

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和此处的评论中所说的那样。但是是的,这个和另一个答案都“解决”了问题。我只是指出了这些解决方案的局限性。