目录
一、条件语句
1.1 测试
1.2 比较整数数值
1.3 字符串比较
1.4 双中括号
1.5 ()与{}
1.6 if语句
1.7 case语句
1.8 echo命令
二、循环语句
2.1 for循环
2.2 while循环
2.3 until循环
一、条件语句
1.1 测试
格式一:test 条件表达式
格式二:[ 条件表达式 ]
测试 是否成功使用 $? 返回值操作符:
-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 #当前有效用户是否为文件属组条件测试:判断某需求是否满足,需要由测试机制来实现,专用的测试表达式需要由测试命令辅助完成测试过程,实现评估布尔声明,以便用在条件性环境下进行执行若真,则状态码变量 $? 返回0若假,则状态码变量 $? 返回1
1.2 比较整数数值
[ 整数1 -操作符 整数2 ] 公式
操作符:
-eq:第一个数等于(Equal)第二个数
-ne:第一个数不等于(Not Equal)第二个数
-gt:第一个数大于(Greater Than)第二个数
-lt:第一个数小于(Lesser Than)第二个数
-le:第一个数小于或等于(Lesser or Equal)第二个数
-ge:第一个数大于或等于(Greater or Equal)第二个数
1.3 字符串比较
[ 字符串1 = 字符串2 ] 是否相同[ 字符串1 != 字符串2 ] 是否不相同[ -z 字符串 ] 是否为空[ -n 字符串 ] 字符是否存在
操作符:
= :字符串内容相同
!= :字符串内容不同
-z :字符串内容为空
-n :字符串是否存在
1.4 双中括号
[[ expression ]] 用法== 左侧字符串是否和右侧的PATTERN相同注意:此表达式用于[[ ]]中,PATTERN为通配符=~ 左侧字符串是否能够被右侧的正则表达式的PATTERN所匹配注意: 此表达式用于[[ ]]中;扩展的正则表达式
#通配符
FILE=test.log
[[ "$FILE" == *.log ]]
echo $?
0FILE=test.txt
[[ "$FILE" == *.log ]]
echo $?
1[[ "$FILE" != *.log ]]
echo $?
0#正则表达式以log结尾的文件
[[ $file =~ log$ ]]
1.5 ()与{}
(CMD1;CMD2;...)和 { CMD1;CMD2;...; } 都可以将多个命令组合在一起,批量执行
()会开启一个新的子bash,不会影响当前bash
( cd /data;ls )
不会改变当前的工作路径{}不会影响当前的bash
{ cd /data;ls }
会改变当前的工作路径,需要主要{ }要与命令间有空格
1.6 if语句
单分支
格式一:
if 判断条件
then 条件为真后执行的代码
fi格式二:
if 判断条件;then
条件为真后执行的代码
fi
双分支
if 判断条件
then
条件为真时执行的代码
else
条件为假时执行的代码
fi
多分支
if 判断条件1
then 条件1为真时执行的代码
elif 判断条件2
then 条件2为真时执行的代码
elif 判断条件3
then 条件3为真时执行的代码
else 以上条件全为假时执行的代码
fi
1.7 case语句
case $i inPART1) #满足PART1则执行分支1
分支1
;;
PART2) #满足PART2则执行分支2
分支2
;;
PART3) #满足PART3则执行分支3
分支3
;;
...
...
*) #以上条件均不满足,则执行该分支
默认分支
;;esac
注意!!
case只支持通配符:
* 任意长度任意字符 ?任意单个字符 [0-9]指定范围内的任意单个字符
1.8 echo命令
echo -n 表示不换行输出
echo -e 表示输出转义符
选项 | 作用 |
---|---|
\r | 光标移至行首,并且不换行 |
\s | 当前shell的名称,如bash |
\t | 插入Tab键,制表符,可用于写脚本时对齐 |
\n | 输出换行 |
\f | 换行,但光标仍停留在原处 |
\ | 表示插入"\"本身转义 |
\b | 表示退格 不显示前一个字符 |
\c | 抑制更多的输出或不换行 |
二、循环语句
2.1 for循环
语法1:for 变量名 in {list} #list表中有多少个量就执行多少次
docommand
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的奇数,中间为步长
语法2:for ((expr1;expr2;expr3))
docommand
doneexpr1:定义变量并赋初值
expr2:定义条件,决定是否循环
expr3:决定循环变量如何改变,决定循环什么时候退出
拓展举例:
99乘法表方法1:
#!/bin/bash for j in {1..9} dofor i in `seq $j`doecho -e "${i}x${j}=$[i*j] \t\c"#\t tab键可以对齐done echo #打印换行done
方法2:
#!/bin/bashfor ((i=1;i<=9;i++)) dofor ((j=1;j<=i;j++))doecho -e "${j}x${i}=$[i*j] \t\c"done echo #打印换行done
2.2 while循环
语句:while 循环条件 #满足条件则进行循环
docommand
done
拓展举例
批量建立用户#!/bin/bash i=0 while [ "${i}" -le 20 ] do useradd stu${i} echo "123456" |passwd --stdin stu${i} &>/dev/null if [ $? -eq 0 ] then echo "用户 stu${i} 被建立" else echo "用户 stu${i} 建立失败" fi let i++ done
跳出循环的方式:
break跳出单个循环 break n 数字数字是几代表跳出n层循环
continue终止某次循环中的命令,但是不会完全终止命令
exit 直接退出脚本
2.3 until循环
语句:until 条件 #当不满足条件时,执行循环
docommand
done
拓展举例
定时给某用户发消息#!/bin/bash username=$1 #定义变量 if [ $# -lt 1 ] #若允许脚本后未在后定义预定义变量,则提示信息 then echo "请在脚本后输入 用户名和发送信息" exit fiif grep "^$username" /etc/passwd &>/dev/null then : elseecho "用户不存在"exit fiuntil who |grep $username &>/dev/null do echo "用户不在线" sleep 5 donemes=$2 echo $mes |write $username