我必须编写只接受正数而不接受字母/单词的脚本。
我创建了两个 if 条件,但它们不能一起工作。当我删除一个时,另一个工作得很好。我如何连接它们?
if [[ ${@:2} -lt 0 ]]; then
shift
echo "error, only positive"
exit 3
fi
if [[ ${@:2} == [a-zA-Z] ]]; then
echo "error, no letters allowed"
exit 4
fi
我的脚本是通过这一行执行的:
./script.sh file.txt arg1 arg2 arg3 ...
因此 arg1、arg2 中的任何一个都不能是 -1 或 a。
答案1
您可能应该迭代所有参数并测试每个参数,如果您可以对这两件事进行一次测试,您可以执行如下操作,这将确保所有参数中只有数字(所以没有-
或字母,但是也没有小数)
pattern='[^0-9]'
for arg; do
if [[ $arg =~ $pattern ]]; then
printf 'Unacceptable option: %s\n' "$arg"
exit 3
fi
done
如果您希望单独的测试具有不同的错误消息和退出代码,您可以在for
循环和测试中执行这些操作arg
,这将依次获取每个命令行选项
答案2
您还可以利用 bash 比较运算符,如下所示:
if [ $arg -eq $arg -a $arg -ge 0 ] 2>/dev/null ;then
echo "accepted"
else
echo "not accepted"
fi
诀窍是,如果您与 -eq 比较两个非数字参数,bash 将引发错误(我们发送到 /dev/null)。