if 中的两个条件(仅限正数,不含字母)

if 中的两个条件(仅限正数,不含字母)

我必须编写只接受正数而不接受字母/单词的脚本。

我创建了两个 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)。

相关内容