GETOPTS 解析空和非空参数

GETOPTS 解析空和非空参数

我正在尝试制作具有两个开关 -h 和 -d 的脚本,-d 具有强制数字参数。在它之后将有不确定数量的文件路径。到目前为止,我已经有了这个,但代码似乎无法识别无效的开关 -r (可以是任何名称),并且当我不输入任何开关时也不起作用:

while getopts ":hd:" opt; do
case $opt in
    h)
            echo $usage
        exit 0
            ;;
    d)
        shift 2
            if [ "$OPTARG" -eq "$OPTARG" ] ; then # ako dalsi argument mame cislo
            depth=$OPTARG
        fi
            ;;
        \?)
        shift 1
            ;;
        :)
            shift 1
            ;;
esac
done
echo $1

当我输入时./pripravne1.sh -d /home/OS/test_pz/test2,我得到./pripravne1.sh: [: /home/OS/test_pz/test2: integer expression expected 当我输入时,./pripravne1.sh -r /home/OS/test_pz/test2我只得到空字符串。

答案1

[ "$OPTARG" -eq "$OPTARG" ] ...不是检查是否$OPTARG为数字的正确方法——如果不是数字,它可能会向用户打印一个令人讨厌的难以理解的错误,或者它可能只是返回真的在所有情况下 (in ksh),或者对于空$OPTARG(in zsh) 也返回 true。

另外,接受参数的选项可以以 或-d12的形式给出-d 12,因此盲注shift 2不会切断它。shift在循环内部执行 a可能会与 产生严重的交互getopts,因为它本身就使用实时参数列表。

考虑到这一点,我的建议是:

die(){ echo >&2 "$@"; exit 1; }
usage(){ echo >&2 "usage: $0 [-h] [-d num] files..."; exit 0; }

depth=0

while getopts :hd: opt; do
        case $opt in
        h)      usage ;;
        d)      case $OPTARG in
                ''|*[!-0-9]*|-|*?-*) die "invalid number $OPTARG" ;;
                *) depth=$OPTARG ;;
                esac
                ;;
        :)      die "argument needed to -$OPTARG" ;;
        *)      die "invalid switch -$OPTARG" ;;
        esac
done
shift "$((OPTIND - 1))"

echo depth="$depth"
echo files="$@"

答案2

单方括号[符合 posix 标准,但比[[通常可以在 bash 中使用的 更难使用。在单方括号标准下,-eq仅适用于整数,不适用于字符串。例如,以下工作正常:if [ "2" -eq "2" ] ; then echo foo; fi。您可以使用双方括号(-eq接受字符串),也可以使用=单方括号形式:

if [ "bar" = "bar" ] ; then echo foo; fi

查看https://ryanstutorials.net/bash-scripting-tutorial/bash-if-statements.php 有关 POSIX if 测试和的信息http://tldp.org/LDP/abs/html/testconstructs.html有关不同类型的测试结构的信息,例如(([[

相关内容