如何检查MyVar
是否包含带有BASH if
语句的仅位数。数字我指的是0-9。
即:
if [[ $MyVar does contain digits ]] <-- How can I check if MyVar is just contains numbers
then
do some maths with $MyVar
else
do a different thing
fi
答案 0 :(得分:14)
这是:
#!/bin/bash
if [[ $1 =~ ^[0-9]+$ ]]
then
echo "ok"
else
echo "no"
fi
如果第一个参数仅包含数字,则打印ok
,否则输出no
。你可以用./yourFileName.sh inputValue
答案 1 :(得分:8)
[[ $myvar =~ [^[:digit:]] ]] || echo All Digits
或者,如果你喜欢if-then
表格:
if [[ $myvar =~ [^[:digit:]] ]]
then
echo Has some nondigits
else
echo all digits
fi
在过去,我们会使用[0-9]
。这种形式不是unicode安全的。现代的unicode-safe替换是[:digit:]
。
答案 2 :(得分:4)
如果您想以符合POSIX的方式进行测试,可以使用以下任一方式:
expr string : regex ## returns length of string if both sides match
或
expr match string regex ## behaves the same
例如,测试$myvar
是否全是数字:
[ $(expr "x$myvar" : "x[0-9]*$") -gt 0 ] && echo "all digits"
注意: 'x'
前置于变量和表达式,以防止测试空字符串抛出错误。要使用测试返回的length
,请不要忘记减去代表1
的{{1}}。
在'x'
形式中,这是一个简短的脚本,用于测试脚本的第一个参数是否包含所有数字:
if-then-else
示例输出
#!/bin/sh
len=$(expr "x$1" : "x[0-9]*$") ## test returns length if $1 all digits
let len=len-1 ## subtract 1 to compensate for 'x'
if [ $len -gt 0 ]; then ## test if $len -gt 0 - if so, all digits
printf "\n '%s' : all digits, length: %d chars\n" "$1" $len
else
printf "\n '%s' : containes characters other than [0-9]\n" "$1"
fi
bash正则表达式测试$ sh testdigits.sh 265891
'265891' : all digits, length: 6 chars
$ sh testdigits.sh 265891t
'265891t' : contains characters other than [0-9]
很好,我使用它,但它是 bashism (仅限于bash shell)。如果您关注可移植性,POSIX测试将适用于任何符合POSIX标准的shell。
答案 3 :(得分:1)
简单!只需在grep中使用表达式选项 下面的解决方案回显该变量,并检查它是否仅包含数字
if [[ $(echo $var | grep -E "^[[:digit:]]{1,}$") ]]
then
echo "var contains only digits"
else
echo "var contains other characters apart from digits"
fi
答案 4 :(得分:0)
不含[[]]的Grep表达式解决方案,可实现更广泛的外壳兼容性:
if [ "$(echo $var | grep -E "^[0-9]{1,}$")" ]; then echo "digits only"; then
echo "var contains digits only"
else
echo "var contains digits and/or other characters"
fi