Shell
运算符
数字运算符
原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。
算数运算符
# 算数运算符
# + 加法
val=`expr 2 + 2`
echo "两数之和为: $val"
# - 减法
val=`expr 4 - 2`
echo "两数之差为: $val"
# * 乘法
val=`expr 2 \* 2`
echo "两数之积为: $val"
#! tip: 乘号(*)前边必须加反斜杠(\)才能实现乘法运算
# / 除法
val=`expr 4 / 2`
echo "两数之商为:$val"
# % 取余
val=`expr 8 % 3`
echo "8 对 3 取余数得:$val"
# = 赋值
var=2
echo "val的值为: $val"
# todo 下方用于判断
# == 判断是否相等
var1=2
var2=4
if [ $a == $b ]
then
echo "a 等于 b"
else
echo "a 不等于 b"
fi
# != 判断是否不相等
var1=2
var2=4
if [ $a != $b ]
then
echo "a 不等于 b"
else
echo "a 等于 b"
fi
# 关系运算符
-gt === a>b a是否大于b a>b? 大于返回true
-lt === a<b a是否小于b a<b? 小于返回true
-ge === a>=b a是否大于等于b a>=b? 是返回true
-le === a<=b a是否小于等于b a<=b? 是返回true
-eq === 相等(比较两个数字) 返回true
-ne === 不相等(比较两个数字) 返回 true
布尔运算符&逻辑运算符
# 布尔运算符
# shell 与或非运算 -a -o !
# 与运算
var1=30
var2=0
[ $var1 -a $var2 ] # 返回 false 因为0为假
var1=30
var2=31
[ $var1 -a $var2 ] # 返回true 因为两者都为真
# 或运算
var1=30
var2=0
[ $var1 -o $var2 ] # 返回true 因为两者有一个为真
# 非运算
var1=30
[ !$var1 ] # 返回false 因为 var1 为真 取非为假
var1=0
[ !$var1 ] # 返回true 因为 var1 为假 取非为真
# 逻辑运行算符
# && ||
# && 逻辑 and
var1=1
var2=0
[[ $var1 && $var2 ]] # 返回false
var1=1
var2=2
[[ $var1 && $var2 ]] # 返回true
# || 逻辑 or
var1=1
var2=0
[[ $var1 || $var2 ]] # 返回true
var1=0
var2=0
[[ $var1 || $var2 ]] # 返回false
字符串运算符
# = 判断两个字符是否相等
var_1='h'
var_2='p'
[ $var_1 = $var_2 ] # 返回false
# != 判断两个字符串是否不相等
var_1='h'
var_2='p'
[ $var_1 != $var_2 ] # 返回true
# -z 判断字符串长度是否不为零
var_1=""
if [ -z "$str_A" ]; then echo '长度为零'; else echo "长度不为零";fi
# 结果为零
var_1='He'
if [ -z "$str_A" ]; then echo '长度为零'; else echo "长度不为零";fi
# 结果不为零
# -n 判断字符串长度是否不为零 与 -z相反
# $ 检测字符串是否为空 不为空则返回true
文件测试运算符
文件测试运算符用于测试Unix文件的各种属性
以下的file皆指文件路径*
例如:file="/usr/local/hello.sh"
# -b file 检测文件是否是块设备文件 如果是则返回true
[ -b $file ]
# -c file 检测文件是否是字符设备文件 如果是则返回true
[ -c $file]
# -d file 检测文件是否是目录 如果是则返回true
[ -d $file]
# -f file 检测文件是否是普通文件(既不是目录,也不是设备文件) 如果是则返回true
[ -f $file]
# -g file 检测文件是否设置了 SGID 位,如果是,则返回 true。
[ -g $file ]
# -k file 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。
[ -k $file ]
# -p file 检测文件是否是有名管道,如果是,则返回 true。
[ -p $file ]
# -u file 检测文件是否设置了 SUID 位,如果是,则返回 true。
[ -u $file ]
# -r file 检测文件是否可读,如果是,则返回 true。
[ -r $file ]
# -w file 检测文件是否可写,如果是,则返回 true。
[ -w $file ]
# -x file 检测文件是否可执行,如果是,则返回 true。
[ -x $file ]
# -s file 检测文件是否为空(文件大小是否大于0),不为空返回 true。
[ -s $file ]
# -e file 检测文件(包括目录)是否存在,如果是,则返回 true。
[ -e $file ]
# todo tip: 其他检查符 -S: 判断某文件是否 socket。 -L: 检测文件是否存在并且是一个符号链接。
字符串
# "" 双引号
读取字符串个数
str=”hello world“
echo "str的长度为: ${#str}"
流程控制
if
if ['判断体'] // if流程开始
then // 执行体
echo '判断为真我被执行'
elif //
then
echo '可能存在多个判断条件 我符合'
else // else 不写then
echo '我不符合条件 so被执行'
fi // 结束此次if判断
for
for str in item1 item2 item3.... itemN # 开始循环的对象
do # 循环体
echo $str
done # 结束循环
# 以上内容可以写成一行 但要在注意格式
for str in item1 item2 item3.... itemN; do echo $str; done;
while
#! /bin/bash
int=1
while(($int<=5)) # 循环条件
do # 符合条件的循环结果
echo $int
let "int++"
done # 结束循环
let用法
let arg [arg...]# 要执行的表达式
# 实例操作
no=2
# 自加操作
let 'no++' === let no+=1
# 自减操作
let 'no--' === let no-=1