一尘不染

解析Shell脚本参数

linux

$myscript.sh -host blah -user blah -pass blah

我想将参数传递给它。

我已经习惯了这样做$1$2$3....但我要开始对其进行命名


阅读 348

收藏
2020-06-07

共1个答案

一尘不染

有很多方法可以解析sh中的参数。Getopt很好。这是一个简单的脚本,可以手动解析内容:

#!/bin/sh
# WARNING: see discussion and caveats below
# this is extremely fragile and insecure

while echo $1 | grep -q ^-; do
    # Evaluating a user entered string!
    # Red flags!!!  Don't do this
    eval $( echo $1 | sed 's/^-//' )=$2
    shift
    shift
done

echo host = $host
echo user = $user
echo pass = $pass
echo args = $@

运行示例如下:

$ ./a.sh -host foo -user me -pass secret some args
host = foo
user = me
pass = secret
args = some args

请注意,由于脚本eval是由用户构造的字符串,因此它甚至不具有强大的鲁棒性,也没有向安全漏洞开放。它仅是作为一种可能的做事方式的示例。一种更简单的方法是要求用户在环境中传递数据。在bourne
shell中(即,不在csh系列中的任何东西):

$ host=blah user=blah pass=blah myscript.sh

工作得很好,和变量$host$user$pass将在脚本可用。

#!/bin/sh
echo host = ${host:?host empty or unset}
echo user = ${user?user not set}
...
2020-06-07