解析shell脚本参数

TIM*_*MEX 9 unix linux bash shell

$myscript.sh -host blah -user blah -pass blah
Run Code Online (Sandbox Code Playgroud)

我想把参数传递给它.

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

Wil*_*ell 15

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 = $@
Run Code Online (Sandbox Code Playgroud)

示例运行如下:

$ ./a.sh -host foo -user me -pass secret some args
host = foo
user = me
pass = secret
args = some args
Run Code Online (Sandbox Code Playgroud)

请注意,由于脚本eval是由用户构造的字符串,因此这甚至不具有远程可靠性并且对安全漏洞大量开放.它仅仅是作为一种可能的做事方式的例子.一种更简单的方法是要求用户在环境中传递数据.在一个bourne shell中(即任何不在csh系列中的东西):

$ host=blah user=blah pass=blah myscript.sh
Run Code Online (Sandbox Code Playgroud)

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

#!/bin/sh
echo host = ${host:?host empty or unset}
echo user = ${user?user not set}
...
Run Code Online (Sandbox Code Playgroud)

  • 使用`declare`而不是`eval`会更安全. (2认同)

Pau*_*ce. 7

以下是处理多头和空头期权的简单方法:

while [[ $1 == -* ]]; do
    case "$1" in
      -h|--help|-\?) show_help; exit 0;;
      -v|--verbose) verbose=1; shift;;
      -f) if (($# > 1)); then
            output_file=$2; shift 2
          else 
            echo "-f requires an argument" 1>&2
            exit 1
          fi ;;
      --) shift; break;;
      -*) echo "invalid option: $1" 1>&2; show_help; exit 1;;
    esac
done
Run Code Online (Sandbox Code Playgroud)

如何轻松处理命令行参数(选项)到我的脚本?