一:shell条件测试
在Shell程序中,用户可以使用测试语句来测试指定的条件表达式的条件的真或者假。当指定的条件为真时,整个条件测试的返回值为0;反之,如果指定的条件为假,则条件测试语句的返回值为非0值。
1.1:test条件测试
test命令和表达式中间至少有一个空格
使用echo $?#命令返回结果进行判断,结果为0成立,反之不成立。
1.2:整数测表达式
[]/test比较符号 | ( ( ) ) / [ [ ] ]比较符号 |
---|---|
-eq | ==/= |
-ge | >= |
-gt | > |
-le | <= |
-lt | < |
-ne | != |
在使用整数比较时,需要注意数字必须是整数,否则会出现报错。
测试表达式符号 | [ ] | test | [ [ ] ] | ( ( ) ) |
---|---|---|---|---|
边界是否需要空格 | 需要 | 需要 | 需要 | 不需要 |
逻辑操作符 | -a/-o/! | -a/-o/! | &&/||/! | &&/||/! |
整数比较符 | -eq/-ge/-gt/-le/-lt/-ne | -eq/-ge/-gt/-le/-lt/-ne | -eq/-ge/-gt/-le/-lt/-ne或=/>=/>/<=/</!= | =/>=/>/<=/</!= |
字符串比较符 | =/==/!= | =/==/!= | =/==/!= | =/==/!= |
是否支持通配符 | 不支持 | 不支持 | 支持 | 不支持 |
注意:[]使用><时使用命令\进行转义且[ ] 两边都必须有空格
[[]] 两边都必须有空格 且><不需要转义。
1.3:文件测试运算符
-b file | 检测文件是否是块设备文件,如果是,则返回 true。 | [ -b $file ] 返回 false。 |
-c file | 检测文件是否是字符设备文件,如果是,则返回 true。 | [ -c $file ] 返回 false。 |
-d file | 检测文件是否是目录,如果是,则返回 true。 | [ -d $file ] 返回 false。 |
-f file | 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 | [ -f $file ] 返回 true。 |
-S | 是否为socket文件 | |
-p | 是否为管道符文件 | |
-L | 是否为链接文件 | |
-u | 是否有suid的权限 | |
-g file | 检测文件是否设置了 SGID 位,如果是,则返回 true。 | [ -g $file ] 返回 false。 |
-k file | 检测文件是否设置了冒险位(Sticky Bit),如果是,则返回 true。 | [ -k $file ] 返回 false。 |
-s file | 检测文件是否为空(文件大小是否大于0),不为空返回 true。 | [ -s $file ] 返回 true。 |
-e file | 检测文件(包括目录)是否存在,如果是,则返回 true。 | [ -e $file ] 返回 true。 |
-r file | 检测文件是否可读,如果是,则返回 true。 | [ -r $file ] 返回 true。 |
-w file | 检测文件是否可写,如果是,则返回 true。 | [ -w $file ] 返回 true。 |
-x file | 检测文件是否可执行,如果是,则返回 true。 | [ -x $file ] 返回 true。 |
示例:使用test -d测试文件是否为目录。
1.4:字符串运算符
二:流程控制之条件判断
2.1:if条件语句的语法
if条件语句根据不同的条件来执行不同的程序分支。
2.1.1:单分支语法
2.1.2:多分支语法
示例:输入成绩,当成绩范围在100-85为A,84-75为B,74-60为C,60以下为D。
2.2:多条件判断语句case
case可针对谋变量不同的值结果进行情景分析
语法:
示例:输入成绩,当成绩范围在100-85为A,84-75为B,74-60为C,60以下为D。
三:流程控制之循环
for循环通常用于遍历整个对象或者数字列表。按照循环条件的不同,for循环语句可以分为带列表的for循环、不带列表的for循环以及类C风格的for循环。
3.1:for循环
3.1.1:for列表循环有次数循环
示例:测试主机是否运行,ping以125...130结尾的网段
3.1.2:for不带列表的循环
示例:测试主机是否运行,ping以125...130结尾的网段
执行脚本时传入列表 192.168.182.{125..130}
3.1.3:C风格的语法格式
示例:打印三角型
示例:打印九九乘法表
3.2:while循环
while循环是另外一种常见的循环结构。使用while循环结构,可以使得用户重复执行一系列的操作,直到某个条件的发生。
示例:猜猜看——在10以内猜一个数。必须输入的是数字!
示例:输入两个数字,比较大小。必须输入的是数字!
四:函数和数组
4.1:什么是函数
Shell中的函数的概念与其他的语言的函数的概念并没有太大的区别。从本质上讲,函数是一个函数名到某个代码块的映射。也就是说,用户在定义了函数之后,就可以通过函数名来调用其所对应的一组代码。
4.2:函数语法
示例:测试主机是否运行,ping以125...130结尾的网段
4.3:数组
4.3.1:定义数组
数组:有序列的元素列表,将有限个相同类型的变量集合命名,数组中各个变量称为元素或分量或下标变量;用来区分各个元素的数字标号称为下标。----数组用户存放多个相同类型数据的集合
方法一:用小括号将变量值括起来赋值给数组变量,每个变量之间要用空格进行分隔。
num1=(1 2 3 4)
方法二:用小括号将变量值括起来,同时采用键值对的形式赋值。
num2=([0]=1 [1]=2 [2]=3 [3]=4)
方法三:通过分别定义数组变量方法。
num3[0]=1;num3[1]=2;num3[2]=3;mum3[3]=4
方法四:动态的定义变量,并使用命令的输出结果作为数组的内容。
num4=(`seq 5`)
num4=(`ls *.sh`)
4.3.2:定义关联数组: 申明关联数组
普通数组的下标只能是整数,而关联数组的下标是字符串。当然也可以使用数字作为下标 关联数组虽然大部分操作类似普通数组,但是其实它不是数组,而是字典,里面存储着键值对,且键的顺序不是按自然顺序排列的。
declare -A 数组名#声明关联数组
@和* 的区别
*会把所有参数识别为一个整体
@会把所有的参数识别为一个整体 当有引号存在时会把引号里面的参数识别成一个参数
居于两个参数,循环打印