文章目录
- 一、条件语句
- 测试
- 比较整数数值
- 字符串比较
- 逻辑运算
- 双中括号
- ( ){ }
- if语句结构
- case语句
 
- 二、循环语句
- 基础知识
- for循环
- while
- until
- 双重循环及跳出循环
 
一、条件语句
测试
条件测试:判断某需求是否满足,需要由测试机制来实现,专用的测试表达式需要由测试命令辅助完成。测试过程,实现评估布尔声明,以便用在条件性环境下进行执行。
若真,则状态码变量 $? 返回0
 若假,则状态码变量 $? 返回1
格式:
 1.test 条件表达式
 2.[ 条件表达式 ](注意大括号前后需要空格)
 测试使用echo$? 的返回值来判断是否成功。
操作符:
- -d:测试是否为目录(Directory)
- -e:测试目录或文件是否存在(Exist)
- -a:测试目录或文件是否存在(Exist)
- -f:测试是否为文件(File)
- -r:测试当前用户是否有权限读取(Read)
- -w:测试当前用户是否有权限写入(Write)
- -x:测试当前用户是否有权限执行(eXcute)
- -L: 测试是否为软连接文件
属性测试补充:
 -s FILE #是否存在且非空
 -t fd #fd 文件描述符是否在某终端已经打开
 -N FILE #文件自从上一次被读取之后是否被修改过
 -O FILE #当前有效用户是否为文件属主
 -G FILE #当前有效用户是否为文件属组

比较整数数值
[ 整数1 -操作符 整数2 ]
- -eq:第一个数等于(Equal)第二个数
- -ne:第一个数不等于(Not Equal)第二个数
- -gt:第一个数大于(Greater Than)第二个数
- -lt:第一个数小于(Lesser Than)第二个数
- -le:第一个数小于或等于(Lesser or Equal)第二个数
- -ge:第一个数大于或等于(Greater or Equal)第二个数
  
字符串比较
常用的测试操作符
- =:字符串内容相同
- !=:字符串内容不同,! 号表示相反的意思
- -z:字符串内容为空
- -n: 字符是否存在
格式
 [ 字符串1 = 字符串2 ] 是否相同
[ 字符串1 != 字符串2 ] 是否不相同
[ -z 字符串 ] 是否为空
[ -n 字符串 ] 字符是否存在
 
逻辑运算
- -a或&&:逻辑与,“而且”的意思全真才为真
- -o或||:逻辑或,“或者”的意思一真即为真
- !:逻辑否
cmd1 操作符 cmd2
组合用法
 ( cmd1 && cmd2) || cmd3
 cmd1 成功 会执行cmd2 不执行cmd3
 cmd1 不成功 会执行cmd3
双中括号
[[ ]]
 == 左侧字符串是否和右侧的字符串相同
 注意:此表达式用于[[ ]]中,字符串为通配符
 =~ 左侧字符串是否能够被右侧的正则表达式的字符串所匹配
 
 重点注意正则表达式和通配符的区别
( ){ }
(CMD1;CMD2;…)和 { CMD1;CMD2;…; } 都可以将多个命令组合在一起,批量执行。
 两者最大的不同点: 用( )执行多条程序时,会开启字shell,即在新的bash环境下,而{ }则是在当前bash环境下。
if语句结构
分支结构
 1.单分支
if 判断条件;
 then 条件为真的分支代码
 fi
 注意: if······fi 主体结构,注意分号是英文格式
 
2.双分支
 if 判断条件; then
 条件为真的分支代码
 else
 条件为假的分支代码
 fi
 
3.多分支
 if 判断条件1
 then
 条件1为真的分支代码
elif 判断条件2
 then
 条件2为真的分支代码
elif 判断条件3;then
 条件3为真的分支代码
…
 else
 以上条件都为假的分支代码 托底
 fi
 
case语句
基本格式
read -p          i #从屏幕输入条件case $i in
PAT1)             #满足分支1条件则执行分支1的程序分支1;;
PAT2)分支2;;
...
*)默认分支;;
二、循环语句
基础知识
echo
 echo -n 表示不换行输出
 echo -e 表示输出转义符
| 选项 | 作用 | 
|---|---|
| \r | 光标移至行首,并且不换行 | 
| \s | 当前shell的名称,如bash | 
| \t | 插入Tab键,制表符 | 
| \n | 输出换行 | 
| \f | 换行,但光标仍停留在原处 | 
| \ | 表示插入"\"本身转义 | 
| \b | 表示退格 不显示前一个字符 | 
| \c | 抑制更多的输出或不换行 | 

 退格删除前面的字符
 注意:退格键和末尾的字符相关,超过末尾的字符数量会出现bug
date
 date查看当前系统时间
-d 你描述的日期,显示指定字符串所描述的时间,而非当前时间
%F 完整日期格式,等价于 %Y-%m-%d
% T 时间(24小时制)(hh:mm:ss)

for循环
循环含义:将某段代码重复运行多次,通常有进入循环的条件和退出循环的条件 。
 常见的循环的命令:for;while;until
 for用于已知循环次数;until、while用于循环次数未知。
列表循环
 语法:
 for 变量名 in {list}
 do
 命令
 done
花括号{ }和seq在for循环中的应用
for i in {1..50..2} 1-50的奇数
for i in {2..50..2} 1-50的偶数
for i in {10..1}  1-10倒序排列for i in $(seq 10)  1-10正序排列
for i in $(seq 10 -1 1) 1-10倒序排列
for i in $(seq 1 2 10) 1-10的奇数,中间为步长

 不带列表循环
 for 变量名
 do
 命令 
 done
 脚本中没有变量参数,需要在执行的时候手动传参。

类似于c语言风格的for循环
for (( 表达式1; 表达式2; 表达式3 )); do 命令; done
for ((expr1;expr2;expr3))
 do
 命令
 done
expr1:定义变量并赋初值
 expr2:决定是否循环
 expr3:决定循环变量如何改变,决定循环什么时候退出
 
while
相对于for,需要知道循环次数,但有些时候并不能知道循环次数。我们只知道停止条件,不知道次数,就需要用到while循环。直到达到条件。
 while循环
 1.语法结构
 2.死循环
 while循环一般用于有条件判断的循环,若判断条件为真,则进入循环,当然条件为假就跳出循环。
 语法:
 while 条件
 do
 命令
 done
死循环
 while 后面跟的条件为一定正确的,一般为true或者[ 1 -eq 1];这样命令会一直执行。

until
until循环和while循环类似,但区别在于while循环在条件为真时继续执行循环,而until则是在条件为假时执行循环。

双重循环及跳出循环
- break跳出单个循环 break n 数字数字是几代表跳出n层循环
- continue终止某次循环中的命令,但是不会完全终止命令
- exit 直接退出脚本
continue终止某次循环的命令;终止i=5。
 
 break跳出一层循环;
 
 break跳出两层循环;
 
 exit直接退出脚本;
 