SHELL脚本中的数值运算,条件测试,以及if循环结构

一、数值运算

A:整数运算

expr

乘法操作应采用 \* 转义,避免被作为Shell通配符;参与运算的整数值与运算操作符之间需要以空格分开,引用变量时必须加$符号。

例:X=1234                       //定义变量
	expr  $X  +  78           //加法expr  $X  +  78           //加法
	expr  $X  -  78           //减法
	expr  $X  \*  78          //乘法,操作符应添加\转义
	expr  $X  /  78           //除法,仅保留整除结果
	expr  $X  %  78         //求模
$[ ] 或$(())
乘法操作*无需转义,运算符两侧可以无空格;引用变量可省略 $ 符号;计算结果替换表达式本身,可结合echo命令输出。
例:echo $[X+78]
	echo $[X-78]
	echo $[X*78]
	echo $[X/78]
	echo $[X%78]

let
expr或$[]、$(())方式只进行运算,并不会改变变量的值;而let命令可以直接
对变量值做运算再保存新的值。因此变量X=1234,在执行let运算后的值会变
更,另外,let运算操作并不显示结果,但是可以结合echo命令来查看:
例:let y=X+22
	echo $y
	let X++;  echo $X        # X++(X=X+1)
	let X--;  echo $X        # X--(X=X-1)
	let X+=78 ; echo $X        # X+=78(X=X+78)
	let X-=78 ; echo $X     # X-=78(X=X-78)
	let X*=78 ; echo $X     # X*=78(X=X*78)
	let X/=78 ; echo $X     # X/=78(X=X/78)
	let X%=78 ; echo $X     # X%=78(X=X%78)

B:小数运算
bc 交互式
先执行bc命令进入交互环境,然后再输入需要计算的表达式。
例:bc
12.34+56.78 //加法
12.34-56.78 //减法
12.3456.78 //乘法
12.34/56.78 //除法
quit //退出交互计算器
echo ‘scale=n;运算式’ | bc 非交互式
例: echo ‘scale=4;12.34+5.678’ | bc
echo 'scale=4;12.34
5.678’ | bc
echo ‘scale=4;12.34/5.678’ | bc

二、条件测试

• 字符串匹配
• 比较整数值的大小
• 识别文件/目录的状态
• 多个条件/操作的逻辑组合
语法格式
test 表达式 或 [ 表达式 ]

字符串比较

== 比较两个字符串是否相同
!= 比较两个字符串是否不相同
例: [ $USER == “root” ] //测试
echo $? //查看结果0为对,非0为错
[ $USER != “root” ]
echo $?
条件测试操作本身不显示出任何信息。测试的条件是否成立主要体现在命令执行后的返回状态(即 ? ) , 所 以 可 以 在 测 试 后 查 看 变 量 ?),所以可以在测试后查看变量 ??的值来做出判断,或者结合&&、||等逻辑操作显示出结果(或作其他操作) 。
A && B //仅当A命令执行成功,才执行B命令
A || B //仅当A命令执行失败,才执行B命令
A ; B //执行A命令后执行B命令,两者没有逻辑关系

一行执行多条命令的情况
&& || ; A && B || C

-z 检查变量的值是否设置为空
-n 或 ! -z 检测变量的值为非空
例: var1=“nb” ; var2=""

	[ -z "$var1" ] && echo "空值" || echo "非空值"
	非空值
	 [ -z $var2 ] && echo "空值" || echo "非空值
	空值
		  //变量var2已设置,但无任何值,视为空
	[ ! -z $var1 ]                //测试var1是否为非空

整数值比较
eq gt ge ne le lt

相比较的数值必须为整数 非整数做比较会报错
基本格式: [ $a -gt 10 ] //不支持小数比较
识别文件/目录的状态
-e(判断对象是否存在,无论是目录还是文件)
-d(判断对象是否为目录,存在且是目录)
-f(判断对象是否为文件,存在且时文件)
-r(判断对象是否可读)
-w(判断对象是否可写)
-x(判断对象是否具有可执行权限)

格式: A && B || C
例: [ -e /etc/fstab ] && echo “xxx” || echo “xxxx”
多个条件/操作的逻辑组合
&& 逻辑与
给定条件必须成立, 整个测试结果才为真。
例:X=20 //设置X变量的值为20

[ $X -gt 10 ] && [ $X -lt 30 ] && echo "YES"
YES

|| 逻辑或
只要其中一个条件成立, 则整个测试结果为真
例:[ -w “/tmp/” ] || [ -w “/var/spool/” ] && echo “OK”
OK
三、使用if选择结构
A:单分支
if 条件测试
then 命令序列
fi
例:检测/media/cdrom目录,若不存在则创建
1. # vim mountdir.sh
2. #!/bin/bash
3. dir="/media/cdrom/"
4. if [ ! -d $dir ];then
6. mkdir -p $dir
7. fi
# chmod +x mountdir.sh

B:双分支
if 条件测试
then
命令序列1
else
命令序列2
fi
例:检测并判断指定的主机是否可ping通

  1. vim pinghost.sh

  2. #!/bin/bash

  3.   ping -c 3 -i 0.2 -W 1 $1 &> /dev/null
    
  4.  if [ $? -eq 0 ] ; then
    
  5.     echo "Host $1 is up."
    
  6. else
    
  7.    echo "Host $1 is down."
    
  8. fi

  9. chmod +x pinghost.sh

C:多分支
if 条件测试1 ;then
命令序列1
elif 条件测试2 ;then
命令序列2
else
命令序列n
fi
例:从键盘读取一个论坛积分,判断论坛用户等级
大于等于90 神功绝世
大于等于80,小于90 登峰造极
大于等于70,小于80 炉火纯青
大于等于60,小于70 略有小成
小于60 初学乍练
1. # vim grade.sh

	2.	#!/bin/bash
	
	3.	read -p "请输入积分(0-100):" JF
	
	4.	if [ $JF -ge 90 ] ; then
	
	5.	    echo "$JF 分,神功绝世"
	
	6.	elif [ $JF -ge 80 ] ; then
	
	7.	    echo "$JF 分,登峰造极"
	
	8.	elif [ $JF -ge 70 ] ; then
	
	9.	    echo "$JF 分,炉火纯青"
	
	10.	elif [ $JF -ge 60 ] ; then
	
	11.	    echo "$JF 分,略有小成"
	
	12.	else
	
	13.	    echo "$JF 分,初学乍练"
	
	14.	fi
      
      # chmod +x grade.sh

补充:为了节省ping测试时间,可以只发送3个测试包(-c 3)、缩短发送测试包的间隔秒数(-i 0.2)、等待反馈的超时秒数(-W 1)
例:# ping -c 3 -i 0.2 -W 1 192.168.4.5

注:若有不足,请及时提出,谢谢!

你可能感兴趣的:(SHELL脚本中的数值运算,条件测试,以及if循环结构)