解析 shell 脚本参数

问题描述 投票:0回答:6
$myscript.sh -host blah -user blah -pass blah

我想将参数传递给它。

我已经习惯了

$1
$2
$3
....但我想开始命名它们

linux bash shell unix
6个回答
16
投票

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}
...

12
投票

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

while [[ $1 == -* ]]; do
    case "$1" in
      -h|--help|-\?) show_help; exit 0;;
      -v|--verbose) verbose=1; shift;;
      -f) if [[ $# > 1 && $2 != -* ]]; 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

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


10
投票

1
投票

我采用上面 William Pursell 的例子(以及 Dennis Williamson 的建议)来表示这种格式的参数: 脚本 -param1=value1 -param2=value2 ...

这是带有单行参数解析器的代码(将其保存在文件“script”中):

#!/bin/bash

while echo $1 | grep ^- > /dev/null; do declare $( echo $1 | sed 's/-//g' | sed 's/=.*//g' | tr -d '\012')=$( echo $1 | sed 's/.*=//g' | tr -d '\012'); shift; done

echo host = $host
echo user = $user
echo pass = $pass

你这样称呼它:

script -host=aaa -user=bbb -pass=ccc

结果是

host = aaa
user = bbb
pass = ccc

有人知道比上面更短的解析参数的代码吗?


0
投票

这是我的方法:

host=""
user=""
pass=""
while [[ "$#" -gt 0 ]]; do
    case $1 in
        -h|--host) host="$2"; shift ;;
        -u|--user) user="$2"; shift ;;
        -p|--pass) pass="$2"; shift ;;
        *) echo "Unknown parameter passed: $1" ;;
    esac
    shift
done


0
投票

声明${@/-}

将解析并分配遵循以下格式的所有参数: 脚本 -param1=value1 -param2=value2 ...

© www.soinside.com 2019 - 2024. All rights reserved.