Linux·shell进阶一
人们总是在意得不到的,从而忘记了已经拥有的
运算
expr 运算并输出结果
[root@zifeiyu opt]# expr 1 + 1 # 注意:运算符号两边的空格必须写并且不能做浮点运算
2
[root@zifeiyu opt]# expr 2 '*' 3
6
[root@zifeiyu opt]# expr 2 \* 3
6
[ ] 或者 [ ]或者 []或者(( )) 运算
如果要直接看结果,可以配合echo命令
[root@zifeiyu opt]# cat aaa
echo $[2-1]
echo $[2*3]
echo $[8/2]
echo $[5%2]
sum=20
sun=21
echo $[sum+sun]
[root@zifeiyu opt]# ./aaa
1
6
4
1
41
let命令
不输出结果,专用于变量的创建或者变量的自增减
let a=1+1 //创建变量
变量的自增减:
常规写法 主流写法
let a=a+1 let a++ 变量a加1
let a=a-1 let a-- 变量a减1
let a=a+10 let a+=10 变量a加10
let a=a-10 let a-=10 变量a减10
let a=a*2 let a*=2 变量a乘以2
let a=a/2 let a/=2 变量a除以2
let a=a%3 let a%=3 变量a除以3取余数
使用bc
bc 可以进行小数计算
[root@zifeiyu opt]# echo "10.0/3.0" | bc
3
[root@zifeiyu opt]# echo "scale=2;10.0/3.0" | bc
3.33
条件测试
可以赋予脚本智能判断
对字符串进行测试
语法格式
test 表达式
[ 表达式 ]
== 两边是否相等,相等时条件测试算成功
!= 两边是否不等,不相等时条件测试算成功
test a == a # 方式一:test ,使用常量判断,再用echo $?测试结果
test a == b
[ a == a ] # 方式二:中括号,使用常量判断,再用echo $?测试结果
[ a == b ]
a=abc
a=xyz
[ $a == $b ] # 使用变量判断两个变量的值是否相等
[ $a != $b ] # 使用变量判断两个变量的值是否不相等
[ "$c" == $b ] # 如果变量为空,有可能报错,加双引号可以避免
-z
[ -z $a ] # 判断变量是否为空,为空时条件测试算成功
[ ! -z $a ] # 判断变量是否非空,非空时条件测试算成功
逻辑组合
语法格式
条件 && 指令 条件成功才执行指令
条件 || 指令 条件失败才执行指令
[ root == $USER ] || exit # 判断当前用户名是否为root
如果判断失败,则执行exit
[ $USER != root ] && exit # 判断当前用户名是否不为root
如果判断成功,则执行exit
使用多个逻辑符号组合
A && B A、B任务都成功算成功
A || B A、B 任务有一个成功算成功
touch a b c
ls a && ls b && ls c # 结果是都显示
ls a || ls b || ls c # 结果是显示a
ls a && ls b || ls c # 结果是显示a和b
ls a || ls b && ls c # 结果是显示a和c
[ root != $USER ] && echo "非管理员不能执行该脚本" && exit # 之前的语句可以改进成这个方式
文件
-e 判断文件是否存在,不关心类型
-f 判断文件是否存在,必须是普通文件
-d 判断文件是否存在,必须是目录
-r 判断当前用户对文件是否有读权限,对root无效
-w 判断当前用户对文件是否有写权限,对root无效
-x 判断当前用户对文件是否有x权限
[ -e abc ] # 判断当前目录下的abc是否存在,用echo $?查结果
[ -f /opt/abc ] # 判断opt下有没有abc这个普通文件
[ -d /opt/abc ] # 判断opt下有没有abc这个目录
mkdir /opt/xyz
[ -d /opt/xyz ] # 判断opt下有没有xyz这个目录
[ -r /opt/abc ] # 判断当前用户对abc是否有读权限
[ -w /opt/abc ] # 判断当前用户对abc是否有写权限
[ -x /opt/abc ] # 判断当前用户对abc是否有x权限
if分支
单分支
语法格式
if 条件测试;then # 满足条件的话就执行下面指令
执行指令
fi
#!/bin/bash
if [ $UID -eq 0 ];then
echo "我是管理员"
echo ok
fi
双分支
语法格式
if 条件测试;then # 满足条件的话就执行下面指令
执行指令A # 指令可以是一条,也可以是多条
else # 否则,不满足条件的话就执行下面指令
执行指令B
fi
#!/bin/bash
if [ $1 == root ];then
echo "我是管理员"
echo ok
else
echo "我不是管理员"
echo no
fi
ping 主机测试脚本
ping -c 3 -i 0.2 -W 1 测试地址
-c 定义ping的次数 -i 定义ping的间隔时间(秒)
-W ping失败时多久反馈结果
#!/bin/bash
ping -c 3 -i 0.2 -W 1 $1 &> /dev/null # 使用$1位置变量更方便
if [ $? -eq 0 ];then
echo "通了!"
else
echo "不通!"
fi
多分支
if 条件测试;then //满足条件的话就执行下面A指令
执行指令A //指令可以是一条,也可以是多条
elif 条件测试;then //满足条件的话就执行下面B指令
执行指令B
elif 条件测试;then //满足条件的话就执行下面C指令
执行指令C
else //否则,不满足条件的话就执行下面指令
执行指令
fi
#!/bin/bash
read -p “请输入月考成绩:” x
[ $x -lt 0 ] && echo “别闹” && exit
if [ $x -ge 90 ];then
echo “优秀!”
elif [ $x -ge 80 ];then
echo “良好!”
elif [ $x -ge 60 ];then
echo “及格。。”
else
echo “晚上没饭了!”
fi
循环,可以反复执行某任务
for循环,可以定义循环次数
for 变量名称 in 值1 值2 值3 。。。 # 此处变量名可以自定义,通常习惯用i,值的多少决定了下面do与done之间的任务执行多少次,每个值之间有空格,这里是有3个值,所以就循环执行指令3次
do
任务
done
编写脚本,可以测试10.8.152.200~10.8.152.210
#!/bin/bash
for i in {200..210}
do
ping -c 3 -i 0.2 -W 1 10.8.152.$i &> /dev/null
if [ $? -eq 0 ];then
echo "通了,ip是10.8.152.$a"
else
echo "不通"
fi
done
改良版,可以统计最终通了和不通的数量
#!/bin/bash
x=0
y=0
for a in {200..210}
do
ping -c 3 -i 0.2 -W 1 10.8.152.$a &> /dev/null
if [ $? -eq 0 ];then
echo "通了,ip是10.8.152.$a"
let x++
else
echo "不通"
let y++
fi
done
echo "$x台通了,$y台不通"