Bash 脚本的多个参数

Bash 脚本的多个参数

我需要检查我的 bash 脚本中用户提供的选项,但调用脚本时并不总是提供这些选项。例如,可能的选项可以是 -dontbuild -donttest -dontupdate 的任意组合,有没有办法可以检查它们?抱歉,如果这个问题真的很基础,我是 bash 脚本的新手。

谢谢

编辑:我尝试了这段代码,并使用选项 -disableVenusBld 调用了脚本,但它仍然打印出“正在开始构建”。我做错了什么吗?提前致谢!

while [ $# -ne 0 ]
do
    arg="$1"
    case "$arg" in
        -disableVenusBld)
            disableVenusBld=true
            ;;
        -disableCopperBld)
            disableCopperBld=true
            ;;
        -disableTest)
            disableTest=true
            ;;
        -disableUpdate)
            disableUpdate=true
            ;;
        *)
            nothing="true"
            ;;
    esac
    shift
done

if [ "$disableVenusBld" != true ]; then
    echo "Starting build"
fi

答案1

丹尼斯的想法是正确的,我想建议进行一些小的修改。

通过位置参数 $1、$2、$3 等访问 shell 脚本的参数... 当前计数以 $# 表示。对此的经典检查是:

while [ $# -ne 0 ]
do
    ARG="$1"
    shift # get rid of $1, we saved in ARG already
    case "$ARG" in
    -dontbuild)
        DONTBUILD=1
        ;;
    -somethingwithaparam)
        SAVESOMEPARAM="$1"
        shift
        ;;
# ... continue
done

正如丹尼斯所说,如果你的要求符合 getopts,那么最好使用它。

答案2

for arg
do
    case "$arg" in
        -dontbuild)
            do_something
            ;;
        -donttest)
            do_something
            ;;
        -dontupdate)
            do_something
            ;;
        *)
            echo "Unknown argument"
            exit 1
            ;;
     esac
done

其中do_something表示设置标志或实际执行某项操作。请注意,for arg隐式迭代$@(位置参数数组),并且相当于显式for arg in $@

还要注意的是,Bash 有一个内置函数叫,getopts但它只接受短选项(例如-x)。还有一个外部实用程序叫getopt,它接受长选项,但它有几个缺陷,不推荐。

options=":es:w:d:"

OLDOPTIND=$OPTIND
while getopts $options option
do
  case $option in
    e     ) do_something;;
    w     ) do_something $OPTARG;;
    d     ) foo=$OPTARG;;
    q     ) do_something;;
    s ) case $OPTARG in
                m | M ) bar="abc";;
                s | S ) baz="def";;
                *     ) echo "Invalid option for blah blah" 1>&2; exit;;
        esac;;
    *     ) echo "Unimplemented option chosen.";;   # DEFAULT
  esac
OLDOPTIND=$OPTIND
done

相关内容