开发者学堂课程【Linux Shell 编程入门与实战:shell脚本逻辑运算和参数传递及实战】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/551/detail/7623?
shell 脚本逻辑运算和参数传递及实战
内容介绍:
1、只读和位置变量
2 、退出状态
3 、退出状态码
4 、算术运算
5、 赋值
6、 并且与或者
7 、练习
1 、只读和位置变量
◆只读变量:只能声明,但不能修改和删除
➢声明只读变量:
readonly name
declare -r name
➢查看只读变量:
readonly -p
◆位置变量:在脚本代码中调用通过命令行传递给脚本的参数
shift2默认情况下是只可以移动一次,但也可以一次移俩,一次可以向左移一位,想移两位,shift后面加个数字即可。
All arg is 1 2 3 4 5 6
The arge number is 7
S
hift 1
1
st arg is 2
2 st arg is 3
3 st arg is 4
All arg is 1 2 3 4 5 6
The arge number is 6
S
hift 2
1
st arg is 4
2 st arg is 5
3 st arg is 6
$1, $2, ... :对应第1、第2等参数, shift [n]换位置
$0:命令本身
$*:传递给脚本的所有参数,全部参数合为一个字符串
$@:传递给脚本的所有参数,每个参数为独立字符串
$#:传递给脚本的参数的个数
$@ $*只在被双弓|号包起来的时候才会有差异
set --清空所有位置变量
2 、退出状态
进程使用退出状态来报告成功或失败
●0代表成功,1-255代表失败
●$?变量保存最近的命令退出状态
例如:
ping -c1 -W1 hostdown &> /dev/nullecho $?
创建一个用户是否成功,只要看$?结果是否为0就可以,
$?对于脚本来讲,在执行完毕后,也可以判断是否成功失败。
root@centos7 bin #f1.sh
/root/bin/f1.sh: line 12: hostnam:command not founnd
root@centos7 bin # echo $?
root@centos7 bin #0
脚本返回的结果是否为0,是由最后一条命令决定的
3、 退出状态码
◆bash自定义退出状态码
exit [n] :自定义退出状态码
注意:脚本中一旦遇到exit命令 ,脚本会立即终止;终止退出状态取决于exit命令后面的数字
注意:如果未给脚本指定退出状态码,整个脚本的退出状态码取决于脚本中执行的最后一条命令的状态码
4 、算术运算
◆bash中的算术运算:help let
+, -,*,/,%取模(取余),**(乘方)
实现算术运算:
(1) tet var=算术表达式
(2) var= $[算术表达式]
(3) var= $((算术表达式))
(4) var= $(expr arg1 arg2 arg3 ..)
注意:expr 是个命令 本身就可以做运算。
#expr 1 + 2
1 + 2 中间有空格是不对的
#expr 3 \* 2
乘号是不可以直接*的
(5) declare-ivar =数值
(6) echo '算术表达式’| bc
◆乘法符号有些场景中需要转义,如*
◆bash 有内建的随机数生成器: $RANDOM ( 0-32767 )
echo $[$RANDOM%50] : 0-49之间随机数
5 、赋值
◆增强型赋值:
+=,-=,*=, /=, %=
◆let varOPERvalue
例如:let count+ =3
自加3后自赋值
◆自增,自减:
let var+= 1
let var++
let var-=1
let var--
6、并且与或者
&并且 and
或者 or
0&0=0
0&1=0
1&0=0
1&1=1
0|0=0
0|1=0
1|0=1
1|1=1
短路与&&
短路或||
0&&0=0
0&&1=0
1&&0=0
1&&1=1
Cmd1&&cmd2
如果cmd1为假,cmd2不需要执行,反之cmd1为真,需要cmd2执行
Cmd1||cmd2
如果cmd1为真,cmd2不需要执行,反之cmd1为假,需要cmd2执行
7、 练习
1、编写脚本/root/bin/sumid.sh,计算/etc/ passwd文件中的第10个用户和第20用户的ID之和,
注意:写脚本尽可能要简洁,不要重复的写,能充分利用的代码,尽可能用一个来代替,不要重复出现。
2、编写脚本/root/bin/sumspace.sh ,传递两个文件路径作为参数给脚本,计算这两个文件中所有空白行之和。
3、编写脚本/root/bin/sumfile.sh,统计/etc, /var, /usr目录中共有多少个一级子目录和文件