我正在尝试制作具有两个开关的脚本 -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
[ "$OPTARG" -eq "$OPTARG" ] ...
不是检查是否$OPTARG
为数字的正确方法 - 如果不是这种情况,它可能会向用户打印一个令人讨厌的难以理解的错误,或者它可能在所有情况下都返回true (inksh
),或者也为空返回 true$OPTARG
(inzsh
)。此外,带参数的选项可以作为
-d12
or给出-d 12
,因此盲人shift 2
不会削减它。并且在循环内做 a可能会与使用实时参数列表的 本身shift
发生严重的交互。getopts
考虑到这一点,这就是我的建议:
单个方括号
[
符合 posix 标准,但比 bash 更难使用[[
,后者通常可以在 bash 中使用。在单方括号标准下,-eq
仅适用于整数,不适用于字符串。例如,以下工作正常:if [ "2" -eq "2" ] ; then echo foo; fi
.-eq
您可以使用接受字符串的双方括号,也可以使用单方=
括号形式:查看https://ryanstutorials.net/bash-scripting-tutorial/bash-if-statements.php 了解有关 POSIX if 测试的信息,查看http://tldp.org/LDP/abs/html/testconstructs.html了解信息在不同种类的测试结构上,例如
((
和[[
。