检查 $1 是否为 /bin/dash 中的整数的最佳方法是什么?
在 bash 中,我可以这样做:
[[ $1 =~ ^([0-9]+)$ ]]
但这似乎不符合 POSIX 标准,并且 dash 不支持这一点
答案1
以下检测整数(正数或负数),并在 和 下工作,dash
均为 POSIX:
选项1
echo "$1" | grep -Eq '^[+-]?[0-9]+$' && echo "It's an integer"
选项2
case "${1#[+-]}" in
''|*[!0-9]*)
echo "Not an integer" ;;
*)
echo "Integer" ;;
esac
或者,稍微使用一下:
(nop) 命令:
! case ${1#[+-]} in *[!0-9]*) :;; ?*) ! :;; esac && echo Integer
答案2
无论是dash
、bash
、ksh
、zsh
、 POSIXsh
或posh
(“Bourne shell 的重新实现” sh
);该case
结构是最广泛可用和最可靠的:
case $1 in (*[!0-9]*|"") false ;; (*) true ;; esac
答案3
您可以-eq
对字符串及其自身进行测试:
$ dash -c 'a="a"; if [ "$a" -eq "$a" ] ; then echo number; else echo not a number; fi'
dash: 1: [: Illegal number: a
not a number
$ dash -c 'a="0xa"; if [ "$a" -eq "$a" ] ; then echo number; else echo not a number; fi'
dash: 1: [: Illegal number: 0xa
not a number
$ dash -c 'a="-1"; if [ "$a" -eq "$a" ] ; then echo number; else echo not a number; fi'
number
如果错误消息有问题,请将错误输出重定向到/dev/null
:
$ dash -c 'a="0xa"; [ "$a" -eq "$a" ] 2>/dev/null|| echo no'
no
答案4
尝试使用它作为算术扩展,看看它是否有效。实际上,您需要比这更严格一些,因为算术扩展会忽略前导和尾随空格等。因此,进行算术扩展,并确保扩展结果与原始变量完全匹配。
check_if_number()
{
if [ "$1" = "$((${1}))" ] 2>/dev/null; then
echo "Number!"
else
echo "not a number"
fi
}
这也接受负数 - 如果您确实想排除它们,请为 . 添加额外的检查$((${1} >= 0))
。