一个shell脚本" getopts错误"

时间:2014-10-16 23:09:04

标签: bash shell unix getopts

我有这段代码:

#!/bin/bash
if [ $# -lt 2 ]; then
    echo "usage: $0 <-lu> <string>"
    exit 1
fi
while getopts "lu" OPT
do
    case $OPT in
        u) casechange=0;;
        l) casechange=1;;
        *) echo "usage: -u<upper> || -l<lower> <string>";
            exit 1;;
    esac
done
shift $(( $optind -1 ))
if [ $casechange -eq 0 ]; then
    tr '[A-Z]' '[a-z]' <$string
elif [ $casechange -eq 1 ]; then
    tr '[a-z]' '[A-Z]' <$string
else
    echo "fatal error"
    exit 1
fi

我收到两个错误:

  • line 15: shift -1: shift count out of range
  • line 19: $string: ambiguous redirect

我做错了什么?我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

OPTIND需要使用大写字母。 Bash默认情况下区分大小写。这使得$optind为空,你有效地试图转移-1。

此外,在处理选项后,您需要使用nonoption参数执行某些操作: string="$1"

然后tr '[A-Z]' '[a-z]' <<<"$string"来自变量的重定向。 最后,您的悲伤路径输出应该是stderr>&2)。

所有组合(+一些小改进):

#!/bin/bash
if [[ $# -lt 2 ]]; then
    echo "usage: $0 <-lu> <string>" >&2
    exit 1
fi
while getopts "lu" OPT
do
    case $OPT in
        u) casechange=0;;
        l) casechange=1;;
        *) echo "usage: -u<upper> || -l<lower> <string>" >&2;
            exit 1;;
    esac
done
shift $(( $OPTIND -1 ))
string="$1"
if [[ "$casechange" -eq 0 ]]; then
    tr 'A-Z' 'a-z' <<<"$string"
elif [[ "$casechange" -eq 1 ]]; then
    tr 'a-z' 'A-Z' <<<"$string"
else
    echo "fatal error" >&2
    exit 1
fi