【问题标题】:How to validate shell arguments?如何验证 shell 参数?
【发布时间】:2018-12-26 16:41:31
【问题描述】:

我正在尝试编写一个简单的sh 脚本,该脚本必须使用 2 个参数调用:

sh myscript.sh --user "some user" --fizz "buzz"

myscript.sh的顶部我有:

#!/bin/sh
# VALIDATION
# 1. Make sure there are 5 positional arguments (that $4 exists).
die () {
    echo >&2 "$@"
    exit 1
}

[ "$#" -eq 5 ] || die "5 arguments required, $# provided"

# 2. Make sure $1 is "-u" or "--user".
# 3. Make sure $3 is "-f" or "--fizz".

如果验证失败,我想打印一条简单的使用信息,然后退出脚本。

认为我有 #1 正确(检查 # 个位置参数),但不知道如何实现 #2 和 #3。想法?

【问题讨论】:

  • 您的问题是“如何在 shell 脚本中比较字符串?”或“如何解析命令行参数?”

标签: shell validation command-line-arguments


【解决方案1】:
# 2. Make sure $1 is "-u" or "--user".

if ! [ "$1" = -u -o "$1" = --user ]; then
    # Test failed. Send a message perhaps.
    exit 1
fi

# 3. Make sure $3 is "-f" or "--fizz".

if ! [ "$3" = -f -o "$3" = --fizz ]; then
    # Test failed. Send a message perhaps.
    exit 1
fi

用于测试变量的两个可能值的其他形式:

[ ! "$var" = value1 -a ! "$var" = value2 ]
[ ! "$var" = value1 ] && [ ! "$var" = value2 ]
! [ "$var" = value1 && ! [ "$var" = value2 ]

对于 Bash 和类似语法的 shell:

! [[ $var = value1 || $var = value2 ]]
[[ ! $var = value1 || ! $var = value2 ]]

除了对if 块使用否定条件外,您还可以使用|| 使用肯定条件

true_condition || {
    # Failed. Send a message perhaps.
    exit 1
}

true_condition || exit 1

当然,另一方面,&& 将适用于否定条件。

使用 case 语句:

case "$var" in
value1|value2)
    # Valid.
    ;;
*)
    # Failed.
    exit 1
    ;;
esac

【讨论】:

    【解决方案2】:

    手动:

    if [ -z "$1" ];then
    fi
    
    if [ -z "$2" ];then
    fi
    
    if [ -z "$3" ];then
    fi
    ...
    

    或者检查getopt

    while getopts "uf" OPTION
    do
     case $OPTION in
         u)
             echo "-u"
             ;;
         f)
             echo "-f"
             ;;
     esac
    done
    

    【讨论】:

      猜你喜欢
      • 2020-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-02
      • 2013-02-14
      • 2022-06-18
      相关资源
      最近更新 更多