day02shell入门篇之运算符,综合示例

shell入门篇之运算符,综合示例


题目:
1.shell的运算符有哪些
2.数学计算的命令有哪些,并举例使用
3.${}中的使用,并举例包含(#, ##,%,%%,:, /, //),并举例使用
4.条件测试的语法
(()), [[]],[],test,功能以及语法格式
5.通过read读入两个整数,并比较他们的大小
6.假设执行一个可以携带参数的script,执行该脚本后屏幕会显示如下的数据

一、变量的定义

在Shell中,通常情况下用户可以直接使用变量,而毋需先进行定义,当用户第一次使用某个变量名 时,实际上就同时定义了这个变量,在变量的作用域内,用户都可以使用该变量。

1、变量定义示例:变量名=变量值

示例:

#!/bin/bash
#定义变量a
a=1
#定义变量b
b="hello"
#定义变量c
c="hello world"
#定义备份路径
bak_dir=/data/backup
#把一个命令的结果赋值变量
变量名=`ls`
变量名=$(ls)

注意:

(1)“=”前后不能有空格

[root@localhost ~]# a= 3
-bash: 3: 未找到命令
[root@localhost ~]# b =4
-bash: b: 未找到命令

(2)字符串类型建议用引号括起来,尤其是特殊字符或有空格

stu_name="zhang san"

引用变量: 变量名或者 变量名 或者 变量名或者{变量名}

查看变量:echo $变量名,set(可查看所有变量:包括自定义变量和环境变量),env显示全局变量,

declare输出所有的变量、函数、整数和已经导出的变量。 取消变量:unset 变量名

作用范围:仅在当前shell中有效 注:可使用export指令将变量转换成环境变量

2、位置参数和预定义变量

许多情况下,Shell脚本都需要接收用户的输入,根据用户输入的参数来执行不同的操作。 从命令行传递给Shell脚本的参数又称为位置参数,Shell脚本会根据参数的位置使用不同的位置参数变量 读取它们的值。

变量说明
$#命令行参数的个数
$n表示传递给脚本的第n个参数,例如$1表示第一个参数,$2表示第二个参数,$3表示第三 个参数
$0当前脚本的名称
$*以"参数1 参数2 参数3…"的形式返回所有参数的值
$@以“参数1”“参数2”“参数3”…的形式返回所有的值
$?前一个命令或者函数的返回状态码。 ? 的返回值用法:( 1 )判断命令、脚本或函数等程序是否执行成功( 2 )若在脚本中调用执行“ e x i t 数字”,则会返回这个数字给“ ?的返回值用法:(1)判断命令、脚本或函数等程序 是否执行成功(2)若在脚本中调用执行“exit 数字”,则会返回这个数字给“ ?的返回值用法:(1)判断命令、脚本或函数等程序是否执行成功(2)若在脚本中调用执行exit数字,则会返回这个数字给?”变量(3)如 果是在函数里,则通过“return 数字”把这个数字以函数值的形式传给“$?"
$$返回本程序的进程ID(PID),不常用
$!获取上一个在后台工作的进程的进程号,不常用
$_保存之前执行的命令的最后一个参数,不常用

二、shell中的引用

在bash中有很多特殊字符,这些特殊字符就具有特殊含义。引用就是通知shell将这些特殊字符当作普通 字符来处理。

符号说明
转 义 字 符 “\”如果将\放到特殊字符前面,shell就忽略这些特殊字符的原有含义,把它们当作普通字符 对待
单 引 号如果将字符串放到一对单引号之间,那么字符串中所有字符的特殊含义被忽略
双引号双引号的引用与单引号基本相同,包含在双引号内的大部分特殊字符可以当作普通字符处 理,但是仍然有一些特殊字符保留自己的特殊含义,比如”$“和“\”以及“ ` ”

三、变量的运算

1,运算符

运算符说明
+、-求和、差
*、/、%求乘积,商,余数
**幂运算,例如3**3是求3的立方,即27
+=、-=、 *=、/=、%=例a+=1相当于a=a+1
++variable、- -variable先将变量variable的值加1,然后再赋给variable; 先将变量variable的值减1, 然后再赋给variable
位运算符<<、 >>位运算通常出现在整数间,它针对的不是整个整数,而是其二进制表示形式中的 某个或者某些位(bit)。例如,2>>1是将二进制形式的2,即10,左移1位,从 而变成100,即4。 左移,4<<2,将4左移2位,结果为16; 右移,8>>2,将8 右移两位,结果为2
&、|、~、^按位与,8&4,将8和4进行按位与运算,结果为0; 按位或,8|4,将8和4进行 按位或运算,结果为12; 按位非,~8,将8进行按位非运算,结果为-9(一个字 符占一个字节,即8个二进制位,最高位为1时为负数); 按位异或(a异或b, a、b值不同结果为1,相同结果为0),10^6,将10和6进行按二进制位异或运 算,结果为12。
<<=、>>=将变量的值左移指定位数之后重新赋给该变量,x<<=3,将x的值左移3位,重新 赋给变量x; 将变量的值右移指定位数之后重新赋给该变量,x>>=4,将变量x的 值右移4位后重新赋给变量x。
&=、|=、^=将变量的值与指定的数值按位与之后重新赋给该变量,x&=8,将变量x的值与8 按位与运算之后重新赋给变量x; 将变量的值与指定的数值按位或之后重新赋给 该变量,x

补充:

按位异或:^ 0^0=1 0^1=1

运算优先级:

从高到低:~、&、^、|

&&大于||

2,运算操作符与运算命令

运算操作符与运算命令意义说明
(())用于整数运算的常用运 算符在(())中使用变量时可以去掉变量前的$符号
let用于整数运算使用let命令可以执行一个或者多个算术表达式,其中的变量名毋需使 用$符号
expr可用于整数 运算,但还 有很多其他 的额外功能使用expr时,运算符及用于计算的数字左右都至少有一个空格,否则 会报错;使用乘号时,必须使用反斜线屏蔽其特定含义;使用expr做 计算,将一个未知的变量和一个已知的整数相加,看返回码是否为 0,如果为0就认为做加法的变量为整数,否则就不是整数。
bclinux下的一 个计算器程序(适合整 数及小数运 算)[root@node13 test9]# echo seq -s "+" 10 = `seq -s “+” 10
$[]用于整数运算
awkawk既可以用于整数运算,也可以用于小数运算
declare定义变量值和属性,-i参数可以用于定义整形变量,做运算

示例:

[root@server day02]# r=$((2+4*8))
[root@server day02]# echo $r
34
[root@server day02]# let r=3+2 s=4*5
[root@server day02]# echo $r; echo $s
5
20
[root@server day02]# r=`expr 4 + 2`
[root@server day02]# echo $r
6
#exper 计算字符长度   //${#parameter}
[root@server day02]# char="i love xiaohua"
[root@server day02]# expr length "$char"
14
#$[]
[root@server day02]# r=$[5+4]
[root@server day02]# echo $r
9
[root@server day02]# awk 'BEGIN {print 2+3*2}'
8
[root@server day02]# echo "6.282 3.14" | awk '{print ($1-$2)}'
3.142
[root@server day02]# declare -i r=3+2  
[root@server day02]# echo $r
5

综合实验

计算用户输入的任意两个整数的和、差、乘积、商、余数。

echo "### (()) ###"
num1=$1
num2=$2
echo sum1=$((num1+num2))
echo "### let ###"
echo -n "num1+num2= "; let sum2=$num1+$num2;echo $sum2
echo "### expr ###"
echo -n " num1>num2= "; expr num1 '>' num2
echo "### bc ###"
echo -n "num1+num2= "; echo $num1+$num2 | bc
[root@server day02]# sh int_test1.sh 10 2
### (()) ###
sum1=12
### let ###
num1+num2= 12
### expr ###
 num1>num2= 0
### bc ###
num1+num2= 12

3,${}

表达式说明
${parameter}返回变量的内容
${#parameter}返回变量内容的长度(按字符)
${paramater:offset}在变量${parameter}中,从位置offset之后开始提取子串到结 尾
${paramater:offset:length}在变量${parameter}中,从位置offset之后开始提取长度为 length的子串
${parameter#word}从变量${parameter}开头开始删除最短匹配的word子串
${parameter##word}从变量${parameter}开头开始删除最长匹配的word子串
${parameter%word}从变量${parameter}结尾开始删除最短匹配的word子串
${parameter%%word}从变量${parameter}结尾开始删除最长匹配的word子串
${parameter/pattern/string}使用string代替第一个匹配的pattern
${parameter//pattern/string}使用string代替所有匹配的pattern

示例:

[root@localhost ~]# str1="hello world"
#返回变量长度
[root@localhost ~]# echo ${#str1}
11
#变量截取
#指定起始位置,一直到结束
[root@localhost ~]# echo ${str1:1}
ello world
#指定长度,不指定起始位置默认从开头开始
[root@localhost ~]# echo ${str1::3}
hel
#指定起始位置和长度
[root@localhost ~]# echo ${str1:1:3}
ell
#从右边第几个字符开始,及字符的个数
[root@localhost ~]# echo ${str1:0-1:1}
d
#输出右边的几个字符
[root@localhost ~]# echo ${str1:0-5}
world
[root@localhost ~]# echo ${str1: -5}
world
#提取完整字符串
[root@localhost ~]# echo ${str1:-5}
hello world

补充:

在这里插入图片描述

四、条件测试

在shell程序中,用户可以使用测试语句来测试指定的条件表达式的条件的真或假。当指定的条件为 真时,整个条件测试的返回值为0;反之,如果指定的条件为假,则条件测试语句的返回值为非0值。

条件测试语法说明
语法1: test <测试 表达式>test命令和<测试表达式>之间至少有一个空格
语法2:[ <测试表 达式> ]该方法和test命令的用法一样,[]的边界和内容之间至少有一个空格
语法3:[[ <测试 表达式> ]]比test和[]更新的语法格式。[[]]的边界和内容之间至少有一个空格。[[]]中可 以使用通配符等进行模式匹配
语法4:((<测试表达 式>))一般用于if语句里,双小括号两端不需要有空格,测试对象只能是整数

常用的文件测试操作符

常用的文件测试操作符说明
-a/-e 文件文件是否存在
-b 文件文件是否存在,且为块文件,如果文件存在且是一个块文件,则结果 为0
-c 文件文件是否存在且为字符文件,如果文件存在且是一个字符文件,则结 果为0
-L 文件文件存在且为链接文件则为真
d 文件文件存在且为目录则为真,即测试表达式成立
-f 文件文件存在且为普通文件则为真,即测试表达式成立
-s 文件文件存在且文件大小不为0则为真
-u 文件文件是否设置suid位,如果设置了suid,则结果为0
-r 文件文件存在且可读为真
-w 文件文件存在且可写为真
-x 文件文件存在且可执行则为真
f1 -nt f2,nt为newer than文件f1比文件f2新则为真,根据文件的修改时间来计算
f1 -ot f2,ot为older than文件f1比文件f2旧则为真,根据文件的修改时间来计算

示例1:

[root@server day02]# ll
total 8
-rw-r--r--. 1 root root   0 Aug 20 18:49 test_file
[root@server day02]# test -f test_file ;echo $?
0
[root@server day02]# test -e test_file ;echo $?
0
[root@server day02]# test -x test_file ;echo $?
1
[root@server day02]# test -d test_file ;echo $?
1

示例2:

注:(注意测试表达式和两边需要有空格)

[root@localhost test3]# ll
total 0
-rw-r--r--. 1 root root 0 Feb 20 10:35 file
[root@localhost test3]# [ -f file ];echo $?
0
[root@localhost test3]# [ -f file1 ];echo $?
1
[root@localhost test3]# [ -w file ];echo $?
0

################################################
[root@localhost test3]# ll
total 0
-rw-r--r--. 1 root root 0 Feb 20 10:35 file
[root@localhost test3]# [[ -f file ]];echo $?
0
[root@localhost test3]# [[ -f file1 ]];echo $?
1
[root@localhost test3]# [[ -x file ]];echo $?
1

示例3:

注意:如果测试的文件路径是用变量来代替,变量一定要加引号

[root@localhost test3]# echo $filepath 该变量值为空
[root@localhost test3]# test -f $filepath;echo $?
0
[root@localhost test3]# test -f "$filepath";echo $?
1

综合示例一

通过read读入两个整数,并比较他们的大小

read -p "please input two numbers:" num1 num2
[ -z "$num1" -o -z "$num2" ] && {
  echo " please input TWO numbers "
  exit 1
}
expr $num1+1 &> /dev/null
return_num1=$?
expr $num2+1 &> /dev/null
return_num2=$?

[ "$return_num1" -eq 0 -a "$return_num2" -eq 0 ] || {
  echo " please input two numbers"
  exit 2
}
[ "$num1" -lt "$num2" ] && {
  echo "$num1 < $num2"
  exit 0
}
[ "$num1" -eq "$num2" ] && {
  echo "$num1 = $num2"
  exit 0
}
[ "$num1" -gt "$num2" ] && {
  echo "$num1 > $num2"
  exit 0
}
################################################
结果:
[root@server day02]# sh test_read_num.sh 
please input two numbers:10 12
10 < 12
[root@server day02]# sh test_read_num.sh 
please input two numbers:12 10
12 > 10
[root@server day02]# sh test_read_num.sh 
please input two numbers:10 10
10 = 10

综合示例二

程序的文件名;共有几个参数;若参数的个数小于 2 个则告知用户参数数量太少;全部的参数内容;第一个参数;第二个参数。

echo " name: $0 "
echo " numbers are $# "

[ "$#" -lt 2 ] && {
echo " the numbers of parameter are too short  "
exit 0
}
[ "$#" -gt 2 ] && {
echo " the numbers of parameter are too long  "
exit 0
}
echo "all parameters are '$@'"
echo " the 1st parameter is $1"
echo " the 1st parameter is $2"
################################################
结果:
[root@server day02]# sh test_script.sh zhangsan lisi xiaohua xiaoming
 name: test_script.sh 
 numbers are 4 
 the numbers of parameter are too long  
 
[root@server day02]# sh test_script.sh zhangsan lisi 
 name: test_script.sh 
 numbers are 2 
all parameters are 'zhangsan lisi'
 the 1st parameter is zhangsan
 the 1st parameter is lisi
 
[root@server day02]# sh test_script.sh zhangsan 
 name: test_script.sh 
 numbers are 1 
 the numbers of parameter are too short  

补充:

字符串测试符

在这里插入图片描述

逻辑操作符

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值