shell 运算符

shell第一篇,我们先看看运算符吧,因为这个和我了解的其他语言有点区别,所以先笔记下!

内容参考:菜鸟教程

基本运算符

  • 算术运算符
  • 关系运算符
  • 布尔运算符
  • 字符串运算符
  • 文件测试运算符

原生的bash不支持简单的数学运算,但是可以通过其他命令来实现,例如awk和expr,expr最常用。

expr是一款表达式计算工具,使用它能完成表达式求值操作。
例如:a+b --> $a+$b 注意 “`”为半角下的tab键上的按键

注意:

  • 表达式和运算符之间要有空格。 正确写法"a + b",错误写法"a+b"
    *完成的表达式要被``包含,这个不是单引号,是Esc下方的按键。

算术运算符

直接通过代码演示了,详细的说明可以看菜鸟教程。

# 局部变量 
# 注意 变量声明不能带空格
a=10
b=20
 
# 错误示范 当2+2没有空格的时候
# 打印结果为 a + b : 2+2
val=`expr 2+2`
echo "a + b : $val"

# 下面全部为正确示范

# >>加法
val=`expr $a + $b`
echo "a + b : $val"

# 打印结果 a + b : 30


# >>减法
val=`expr $a - $b`
echo "a - b : $val"

# 打印结果 a - b : -10


# >>乘法 利用\转译下*
val=`expr $a \* $b`
echo "a * b : $val"

# 打印结果 a * b : 200


# >>除法
val=`expr $b / $a`
echo "b / a : $val"

# 打印结果 b / a : 2


# >>取余
val=`expr $b % $a`
echo "b % a : $val"

# 打印结果 b % a : 0


# >>赋值 上面一直在演示,不能带空格
val=$a
echo "a : $val"

# 打印结果 a : 10


# >>相等 用来比较两个数
if [[ $a == $b ]]; then
    echo "a 等于 b"
else
    echo "a 不等于 b"
fi 

# 打印结果 a 不等于 b


# >>不相等 用来比较两个数
if [[ $a != $b ]]; then
    echo "a 不等于 b"
else
    echo "a 等于 b"
fi

# 打印结果 a 等于 b
  • 乘法运算的"*"必须使用""进行转义才能够使用
  • if...then...else...fi 是条件语句,同c语言的if...else
  • 在mac中shell的expr语法是$((表达式)),这个时候的"*"不需要""进行转义了。

关系运算符

# 局部变量
a=10
b=20

# 练习 -eq 是否相等
if [[ $a -eq $b ]]; then
    echo "$a -eq $b : a 等于 b"
else
    echo "$a -eq $b : a 不等于 b"
fi

# 练习 -ne 是否不相等
if [[ $a -ne $b ]]; then
    echo "$a -ne $b : a 不等于 b"
else
    echo "$a -ne $b : a 等于 b"
fi

# 练习 -gt 是否大于
if [[ $a -gt $b ]]; then
    echo "$a -gt $b : a 大于 b"
else
    echo "$a -gt $b : a 不大于 b"
fi

# 练习 -lt 是否小于
if [[ $a -lt $b ]]; then
    echo "$a -lt $b : a 小于 b"
else
    echo "$a -lt $b : a 不小于 b"
fi

# 练习 -ge 是否大于等于
if [[ $a -ge $b ]]; then
    echo "$a -ge $b : a 大于或等于 b"
else
    echo "$a -ge $b : a 小于 b"
fi

# 练习 -le 是否小于等于
if [[ $a -le $b ]]; then
    echo "$a -le $b : a 小于或等于 b"
else
    echo "$a -le $b : a 大于 b"
fi
输出结果:
10 -eq 20 : a 不等于 b
10 -ne 20 : a 不等于 b
10 -gt 20 : a 不大于 b
10 -lt 20 : a 小于 b
10 -ge 20 : a 小于 b
10 -le 20 : a 小于或等于 b

布尔运算符

# 局部变量
a=10
b=20

# ! 非运算
if [[ $a != $b ]]; then
    echo "$a != $b : a 不等于 b"
else
    echo "$a != $b : a 等于 b"
fi

# -a 与运算
if [ $a -lt 100 -a $b -gt 15 ]; then
    echo "$a 小于 100 且 $b 大于15 : 返回 true"
else
    echo "$a 小于 100 且 $b 大于15 : 返回 false"
fi

# -o 或运算
if [ $a -lt 100 -o $b -gt 100 ]; then
    echo "$a 小于 100 或 $b 大于100 : 返回 true"
else
    echo "$a 小于 100 或 $b 大于100 : 返回 false"
fi

# 补充运算
if [ $a -lt 5 -o $b -gt 100 ]; then
    echo "$a 小于 5 或 $b 大于 100 : 返回 true"
else
    echo "$a 小于 5 或 $b 大于 100 : 返回 false"
fi
输出结果:
10 != 20 : a 不等于 b
10 小于 100 且 20 大于15 : 返回 true
10 小于 100 或 20 大于100 : 返回 true
10 小于 5 或 20 大于 100 : 返回 false

逻辑运算符

# 局部变量
a=10
b=20


# && 逻辑与 ADN
if [[ $a -lt 100 && $b -gt 100 ]]; then
    echo "返回 true"
else
    echo "返回 false"
fi


# || 逻辑或 OR
if [[ $a -lt 100 || $b -gt 100 ]]; then
    echo "返回 true"
else
    echo "返回 false"
fi
输出结果:
返回 false
返回 true

字符串运算符

# 局部变量
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


# -z 检测字符串长度是否为0
if [[ -z $a ]]; then
    echo "-z $a : 字符串长度为 0"
else
    echo "-z $a : 字符串长度不为 0"
fi


# -n 检测字符包长度是否不为0
if [[ -n $a ]]; then
    echo "-n $a : 字符串长度不为 0"
else
    echo "-n $a : 字符串长度为 0"
fi


# str 检测字符串是否不为空
if [[ $a ]]; then
    echo "$a : 字符串不为空"
else
    echo "$a : 字符串为空" 
fi
输出结果:
abc = efg : a 不等于 b
abc != efg : a 不等于 b
-z abc : 字符串长度不为 0
-n abc : 字符串长度不为 0
abc : 字符串不为空

文件测试运算符

# 文件路径
file="/Users/lijianping/CodeHome/shell/les01/file.sh"

# -r 检测文件是否可读
if [[ -r $file ]]; then
    echo "文件可读"
else
    echo "文件不可读"
fi

# -w 检测文件是否可写
if [[ -w $file ]]; then
    echo "文件可写"
else
    echo "文件不可写"
fi

# -x 检测文件是否可执行
if [[ -x $file ]]; then
    echo "文件可执行"
else
    echo "文件不可执行"
fi

# -f 文件是否为普通文件 即不是目录,不是设备文件
if [[ -f $file ]]; then
    echo "文件为普通文件"
else
    echo "文件为特殊文件"
fi

# -d 检测文件是否为目录
if [[ -d $file ]]; then
    echo "文件是个目录"
else
    echo "文件不是目录"
fi

# -s 检测文件是否为空 即文件大小是否大于0
if [[ -s $file ]]; then
    echo "文件不为空"
else
    echo "文件为空"
fi

# -e 检测文件是否存在 包括目录
if [[ -e $file ]]; then
    echo "文件存在"
else
    echo "文件不存在"
fi
输出结果:
文件可读
文件可写
文件不可执行
文件为普通文件
文件不是目录
文件不为空
文件存在

其他文件测试相关操作符介绍:

操作符 说明
-b file 检测文件是否是块设备文件
-c file 检测文件是否是字符设备文件
-g file 检测文件是否设置了SGID位
-k file 检测文件是否设置了粘着位(Sticky Bit)
-p file 检测文件是否是有名管道
-u file 检测文件是否设置了SUID位

你可能感兴趣的:(shell 运算符)