我有这段代码:
#!/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
我做错了什么?我该如何解决这个问题?
答案 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