shell学习系列之运算符

截取链接文章的部分内容: https://blog.csdn.net/taiyang1987912/article/details/38893381?utm_source=app


前言

Shell各种判断结构和运算符的用法是shell编程的基础,了解shell的判断、运算符和一些退出状态对后面的学习有很重要的影响。shell有一个内部命令test经常用于对判断语句进行测试一种或几种状态的条件是否成立。

退出状态

(1)Linux系统,每当命令执行完成后,系统返回一个退出状态。若退出状态值为0,表示命令运行成功;反之若退出状态值不为0,则表示命令运行失败。最后一次执行命令的退出状态值被保存在内置变量"$?"中。

在这里插入图片描述

(2)exit命令格式:exit status(status在0~255之间),返回该状态值时伴随脚本的退出,参数被保存在shell变量$?中。

测试命令

(1)Linux的shell中的测试命令,用于测试某种条件或某几种条件是否真实存在。测试命令是判断语句和循环语句中条件测试的工具,对判断和运算符的比较测试有很大的帮助。
(2)测试条件为真,返回一个0值;为假,返回一个非0整数值。测试命令有两种方式,一种test expression(表达式);另一种命令格式[ expression ],其中"[“是启动测试命令,”]“要与之配对,而且”[“和”]"前后的空格必不可少,此方式常作为流程控制语句的判断条件。

运算符

(1)整数比较运算符
在这里插入图片描述
格式:test “num1” operator “num2"或[ “num1” operator “num2” ],测试结果为真用0表示,为假用非0表示。但只能用于比较数值的大小, 不可用于字符串、文件操作(字符串比较运算符和文件操作符也不能用于其他的操作)。
在这里插入图片描述
对浮点型数值进行比较,不能使用整型运算符。
(2)字符串运算符
在这里插入图片描述
Shell编程是严格区分大小写的,并注意空格的问题,运算符左右的空格不能少。
在这里插入图片描述
在这里插入图片描述
字符串赋值和整数赋值没有区别,而shell对变量弱化了,因此不要把字符串比较运算符当作整数比较运算符使用。
(3)文件操作符
在这里插入图片描述
文件操作符中的可读、可写、可执行的权限判断经常和chmod命令联用。
(4)逻辑运算符
在这里插入图片描述
用于测试多个条件是否为真或为假,也可使用逻辑非测试单个表达式。
表达式:expression1 -a expression1 -aexpression1(并不是所有的运算符都会被执行,只有表达式expression1为真,才会测试expression2为真。只有expression1和expression2都为真才会接着测试expression3是否为真。)
表达式:expression1 -aexpression1 -aexpression1(只要expression1为真,就不用去测试表达式expression2和expression3。只有expression1为假时才会去判断表达式expression2和expression3。同样,只有expression2和expression3同时为假时才会去测试expression3)。
例如:判断文件存在并cd切换目录,[-e /tmp/test -a -d /tmp/test ] || cd /tmp/test或[-e /tmp/test ] && [ -d /tmp/test ] || cd /tmp/test
例如:文件可执行则启动,[-x /etc/init.d/network] && result=/etc/init.d/network start
(5)算术运算符
在这里插入图片描述
使用let命令来执行算术运算,除法和取余运算过程中要注意除数不能为0,使用算术运算符无法对字符串、文件、浮点型数进行计算(浮点型操作,需要用到专门的函数)。
在这里插入图片描述
算术运算符与赋值运算符”="联用,称为算术复合赋值运算符。(6)位运算符
在这里插入图片描述
用于整数间的运算,按位与运算只有两个二进制都为1,结果才为1;按位或运算只要有一个二进制位为1,则结果为1;按位异或运算两个二进制位数相同时,结果为0,否则为1。按位取反运算符将二进制中的0修改成1,1修改成0。
在这里插入图片描述
位运算符同样可以同赋值运算符联用,组成复合赋值运算符。(7)自增自减运算符
自增自减运算符包括前置自增、前置自减、后置自增和后置自减。自增自减操作符的操作元只能是变量,不能是常数或表达式,且该变量值必须为整数型。

#!/bin/sh
 
 num1=5
 
 let "a=5+(++num1) "
 echo "a=$a"
 
 num2=5
 
 let  "b=5+(num2++) "
 echo "b=$b"

(8)数字常量
Shell脚本或命令默认将数字以十进制的方式进行处理,当使用0作为前缀时表示八进制,当使用0x进行标记时表示十六进制,同时还可使用num#这种形式标记进制数。

#!/bin/sh
 
let "num1=40"
echo "num1=$num1"
 
let "num2=040"
echo "num2=$num2"
 
let "num3=0x40"
echo "num3=$num3"

分别使用设置数字常量40的十进制、八进制和十六进制的表示方式,产生的十进制结果是不同的。
在这里插入图片描述

#!/bin/sh
 
let "num1=2#1101100110001101"
echo "num1=$num1"
 
let "num2=8#50"
echo "num2=$num2"
 
let "num3=16#50"
echo "num3=$num3"

在这里插入图片描述

case结构

  case结构变量值依次比较,遇到双分号则跳到esac后的语句执行,没有匹配则脚本将执行默认值"*)"后的命令,直到"';;"为止。case的匹配值必须是常量或正则表达式。
#!/bin/bash
  
echo "Please Input a score_type(A-E): "
read score_type
 
case "$score_type" in
A)
     echo "The range of score is from 90 to 100 !";;
B)
     echo "The range of score is from 80 to 89 !";;
C)
     echo "The range of score is from 70 to 79 !";;
D)
     echo "The range of score is from 60 to 69 !";;
E)
     echo "The range of score is from 0 to 59 !";;
*)
     echo "What you input is wrong !";;
esac

猜你喜欢

转载自blog.csdn.net/daisy2001daisy/article/details/106395331