Tra*_*efi 0 shell-script 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
Run Code Online (Sandbox Code Playgroud)
当我输入时./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
我只得到空字符串。
[ "$OPTARG" -eq "$OPTARG" ] ...
不是检查是否$OPTARG
为数字的正确方法——如果不是这种情况,它可能会向用户打印一个令人讨厌的难以理解的错误,或者它可能在所有情况下都返回true (in ksh
),或者也返回 true 为空$OPTARG
(in zsh
)。
此外,带参数的选项可以作为-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="$@"
Run Code Online (Sandbox Code Playgroud)