最近在写shell的时候发现数字和字符串的概念模糊,整理一下该方面的知识点。
一、数字之间的比较
如果这种情况下如果双方不是整数比较的内容
会报错integer expression expected。这是因为系统把数字当成了字符串处理。
-eq 等于,如:if [ "$a" -eq "$b" ]
-ne 不等于,如:if [ "$a" -ne "$b" ]
-gt 大于,如:if [ "$a" -gt "$b" ]
-ge 大于等于,如:if [ "$a" -ge "$b" ]
-lt 小于,如:if [ "$a" -lt "$b" ]
-le 小于等于,如:if [ "$a" -le "$b" ]
以下的if条件是双括号。
< 小于(需要双括号),如:(("$a" < "$b"))
<= 小于等于(需要双括号),如:(("$a" <= "$b"))
> 大于(需要双括号),如:(("$a" > "$b"))
>= 大于等于(需要双括号),如:(("$a" >= "$b"))
二、字符串之间的比较
-
=
:检测两个字符串是否相等,相等返回 true。 -
!=
:检两个字符串是否相等,不相等返回 true。 -
-z
:检测字符串长度是否为0,为 0 返回 true。 -
-n
:检测字符串长度是否为0,不为 0 返回 true。 -
str
:检测字符串是否为空,不为空返回 true。 - 要记得操作符左右两边都要加空格,否则会报语法错误。
#!/bin/bash
# author:陈树义
# site:http://www.shuyi.me
a="abc"
b="efg"
# 字符串是否相等
if [ $a = $b ]
then
echo "$a = $b : a 等于 b"
else
echo "$a = $b: a 不等于 b"
fi
if [ $a != $b ]
then
echo "$a != $b : a 不等于 b"
else
echo "$a != $b: a 等于 b"
fi
# 字符串长度是否为0
if [ -z $a ]
then
echo "-z $a : 字符串长度为 0"
else
echo "-z $a : 字符串长度不为 0"
fi
if [ -n "$a" ]
then
echo "-n $a : 字符串长度不为 0"
else
echo "-n $a : 字符串长度为 0"
fi
# 字符串是否为空
if [ $a ]
then
echo "$a : 字符串不为空"
else
echo "$a : 字符串为空"
fi
结果:
abc = efg: a 不等于 b
abc != efg : a 不等于 b
-z abc : 字符串长度不为 0
-n abc : 字符串长度不为 0
abc : 字符串不为空
注意:
< 小于,在ASCII字母顺序下.如:
if [[ "$a" < "$b" ]]
if [ "$a" \< "$b" ]
注意:在[]结构中"<"需要被转义.
> 大于,在ASCII字母顺序下.如:
if [[ "$a" > "$b" ]]
if [ "$a" \> "$b" ]
注意:在[]结构中">"需要被转义.
#需要转义<,否则认为是一个重定向符号
if [ $A /< $B ];then
echo "[ < ]"
fi
if [[ $A < $B ]];then
echo "[[ < ]]"
fi
#需要转义>,否则认为是一个重定向符号
if [ $A /> $B ];then
echo "[ > ]"
fi
if [[ $A > $B ]];then
echo "[[ > ]]"
fi
判断是否为数字的方法
#!/bin/bash
## 方法1
a=1234;echo "$a"|[ -n "`sed -n '/^[0-9][0-9]*$/p'`" ] && echo string a is numbers
第一个-n是shell的测试标志,对后面的串"`sed -n '/^[0-9][0-9]*$/p'`" 进行测试,如果非空,则结果为真。
sed默认会显示所有输入行信息的,sed 的“-n”选项是让sed不要显示,而只显示我们所需要的内容:即后面的表达式所匹配的行,这是通过表达式中加入“p”命令来实现的。
/^[0-9][0-9]*$/他的含义是匹配至少由一位数字构成的行
## 方法2, 可以,不过不是bash实现的,是使用了grep的正则
#if grep '^[[:digit:]]*$' <<< "$1";then
# echo "$1 is number."
#else
# echo 'no.'
#fi
## 方法3
#if [ "$1" -gt 0 ] 2>/dev/null ;then
# echo "$1 is number."
#else
# echo 'no.'
#fi
## 方法4,case
#case "$1" in
# [1-9][0-9]*)
# echo "$1 is number."
# ;;
# *)
# ;;
#esac
## 方法5,awk
#echo $1| awk '{print($0~/^[-]?([0-9])+[.]?([0-9])+$/)?"number":"string"}'
## 方法5,awk
#if [ -n "$(echo $1| sed -n "/^[0-9]\+$/p")" ];then
# echo "$1 is number."
#else
# echo 'no.'
#fi
## 方法6,expr
expr $1 "+" 10 &> /dev/null
if [ $? -eq 0 ];then
echo "$1 is number"
else
echo "$1 not number"
fi
#!/bin/bash
if [ -n "$1" ]; then
if [[ $1 =~ ^[0-9]+$ ]]; then
echo "$1 Is Number."
else
echo "$1 No Number."
fi
else
echo "please input number!"
fi
说明:if [[ $1 =~ ^[0-9]+$ ]]
(1)=~ 运算符就是进行正则表达式判断之用的,左侧的字符串会依右侧的正则表达式做匹配,
若匹配则结果为true,不匹配则结果为false。
(2)^是开头开头符号,$是结尾符号,+号是多个的意思,不限位数与 *号类似。
(3)if [ -n "$1" ];表示$1不为空;if [ ! -n "$1" ];表示$1为空
即:if [ -n str1 ]当串的长度大于0时为真(串非空)
if的参数
–b 当file存在并且是块文件时返回真
-c 当file存在并且是字符文件时返回真
-d 当pathname存在并且是一个目录时返回真
-e 当pathname指定的文件或目录存在时返回真
-f 当file存在并且是正规文件时返回真
-g 当由pathname指定的文件或目录存在并且设置了SGID位时返回为真
-h 当file存在并且是符号链接文件时返回真,该选项在一些老系统上无效
-k 当由pathname指定的文件或目录存在并且设置了“粘滞”位时返回真
-p 当file存在并且是命令管道时返回为真
-r 当由pathname指定的文件或目录存在并且可读时返回为真
-s 当file存在文件大小大于0时返回真
-u 当由pathname指定的文件或目录存在并且设置了SUID位时返回真
-w 当由pathname指定的文件或目录存在并且可执行时返回真。一个目录为了它的内容被访问必然是可执行的。
-o 当由pathname指定的文件或目录存在并且被子当前进程的有效用户ID所指定的用户拥有时返回真。