1.条件测试
文件测试与整数测试
test命令 测试表达式是否成立,若成立返回0,不成立返回其他数值
格式1:test 条件表达式
格式2:[ 条件表达式 ]
测试 是否成功使用 $?
操作符:
-d:测试是否为目录(Directory)
-e:测试目录或文件是否存在(Exist)
-a:测试目录或文件是否存在(Exist)
-f:测试是否为文件(File)
-r:测试当前用户是否有权限读取(Read)
-w:测试当前用户是否有权限写入(Write)
-x:测试当前用户是否有权限执行(eXcute)
-L: 测试是否为软连接文件
可以通过help test 进行查看
判断是否有读取权限,不是看文件本身,而是看实际结果
比如/etc/shadow文件,它本身是所有人都没有任何权限的,但是,作为root用户,可以无视该权限,直接读取
但是执行权限比较特殊,如果属主,属组,其它用户任何一方有执行权限,那么超级用户就会有执行权限,如果所有人都没有,那么,超级用户也没有
a 和 e 的区别 ,建议使用e选项
2.
整数值比较
格式:[ 整数1 操作符 整数2 ]
-eq:第一个数等于(Equal)第二个数
-ne:第一个数不等于(Not Equal)第二个数
-gt:第一个数大于(Greater Than)第二个数
-lt:第一个数小于(Lesser Than)第二个数
-le:第一个数小于或等于(Lesser or Equal)第二个数
-ge:第一个数大于或等于(Greater or Equal)第二个数
应用:监控磁盘空间的大小触发警报
手动将它添加一些文件:dd if=/dev/zero of=/boot/bigfile
然后再去执行这个脚本
也可以指定将信息发送位置
mail -s :表示指定邮箱
test:邮件名称
3. 逻辑测试(短路运算)
格式1:[ 表达式1 ] 操作符 [ 表达式2 ] ...
格式2:命令1 操作符 命令2 ...
操作符 | 作用 |
&& | 逻辑的与,"而且"的意思。 |
|| | 逻辑的或,"或者"的意思。 |
! | 逻辑的否。 |
符号&&
代表逻辑上的”与“,当前面的命令执行成功才会执行后面的命令,判断/dev/cdrom 设备是否存在,若存在则输出exist
符号||
| | 是命令行级别的逻辑运算符,用于连接两个命令,如果第一个命令执行后返回非零退出状态(即失败),则执行第二个命令。如果执行成功(即其退出状态码为0),则第二个命令不会被执行
短路与&& 短路或||
两个符号一般都是连续使用
$USER是一个变量,显示当前用户名
[root@localhost data]#[ $USER = root ]&&echo "yes" || echo "no"
yes
如果当前用户名等于root则执行&&符号后面的命令打印yes
如果不等于则执行||后面的命令打印no
因为前两个命令都成功了,所以不会执行||后面的命令
[root@localhost data]#[ $USER! = root ]&&echo "yes" || echo "no"
no
如果当前用户名不等于root则执行&&符号后面的命令打印yes
如果等于则执行||后面的命令打印no
因为第一个命令是错误的,当前用户等于root,!否定之后,就不等于root
所以第二个命令也不会执行,就会执行||后面的命令
4.字符串比较
格式1:[ 字符串1 = 字符串2 ][ 字符串1 != 字符串2 ](这里的!表示取反的意思)格式2:[ -z 字符串 ]
常用的测试操作符
操作符 | 含义 |
---|---|
= | 字符串内容相同 |
!= | 字符串内容不同 |
-z | 字符串内容为空 |
5. if语句
if单分支语句
格式:
if 条件测试操作
then 命令顺序
fi
if单分支语句与$$效果一致
如果if后面的条件测试成立则执行then后的命令如果不成立则直接结束判断
[表达式1]&&[表达式2]
如果表达式1成立则执行表达式2如果不成立则不会执行
if双分支语句
格式:
if 条件测试操作
then 命令顺序1
else 命令顺序2
fi分支语句
例子1
例子2
if双分支语句与&& || 效果一致
如果if后面的条件成立则执行then后命令如果不成立则执行else后命令
[表达式1] $$ [表达式2] || [表达式3]
如果表达式1成立则执行表达式2如果不成立则执行表达式3
if多分支语句
格式:
if 条件测试操作1
then 命令序列1
elif 条件测试操作2
then命令序列2
else命令序列3
fi分支语句
示例1:判断分数范围,分出优秀、合格、不合格三档
(上面第5行GREDE改GRADE)
示例2:判断当前时间输出不同问好
6.case语句
基本语法如下:
1 case $变量名 in
2 模式1) # 判断条件
3 命令1... # 判断为该模式后需要执行的命令
4 ;;
5 模式2)
6 命令2...
7 ;;
8 模式3|模式4) # 可以用'|'分隔多个模式进行联合匹配
9 命令3...
10 ;;
11 *)
12 default_commands... # 匹配所有未明确列出的其他情况(可选)
13 ;;
14 esac # 内容的结尾格式,与if语句中的fi类似
注意点:
case行首必须以单词“in”,每一模式必须以单个右括号")"结束
双分号";;"表示命令序列的结束
模式字符串中,可以用方括号表示一个连续的范围,如"[0-9]";还可以使用竖杠|表示或。
最后的*)表示默认模式,其中的 * 表示其他
示例:判断分数范围,分出超级棒、优秀、合格、不合格四档
7.循环语句
在Shell脚本中,有多种类型的循环结构,包括 for、while 和 until 循环。
循环的含义是:将某串码段重复多次利用
for:已知次数的情况下
while、unlie:未知次数的情况下
for语句
for条件语句会先读取多个不同的变量值,然后逐一执行同一组命令
其执行过程为:
基本语法为:上下两种都可以
1 for 变量名 in 取值列表 ;do
2 命令序列
3 done
1 for 变量名 in 取值列表
2 do
3 命令序列
4 done
示例1:批量创建用户
首先建立一个文件,在里面添加用户名
现在来写一个脚本
批量删除用户将useradd改为userdel -r
示例2:算数累加,求1-100的和
for还有另外一种或用法。可以使用help for进行查看
这种语法,偏向C语言类的风格
-
for ((表达式1;表达式2;表达式3))
-
do
-
命令序列
-
done
-
表达式1:定义变量并赋初值
-
#表达式2:决定是否循环,正确则循环,不正确直接退出
-
#表达式3:决定循环变量如何改变,决定循环什么时候退出
我们使用这一种方法进行算数累加
sum=0 #赋予sum变量最初值
for ((i=0;i<=100;i++))
#i=0:变量初始值,先决条件
#i<=100:判断条件;i小于等于100,如果不正确,直接退出
#i++:变量自身+1
#这条信息的意思是,每次调取这个变量时,都会迭代生成新的+1数值,一直到100结束
do
sum=$[sum+i] #在每次循环中,将当前数值i加到变量sum上
done
echo $sum
++ | 自身变量+1 |
-- | 自身变量-1 |
+=5 | 自身变量+5 |
-=5 | 自身变量-5 |
*=5 | 自身变量*5 |
/=5 | 自身变量/5 |
%=5 | 自身变量%5 |
while语句
while 条件语句用于重复测试某个条件,当条件成立时则继续重复执行
语法结构
-
while 判断条件
-
do
-
命令1
-
done
-
#语法与if相似
while循环一般用于有条件判断的循环,若判断条件为真,则进入循环,当条件为假就跳出循环
死循环
while 死循环是指一个 while 循环结构,其条件始终为真,导致循环体内的命令会无限重复执行,除非外部干预(如通过 Ctrl+C 终止程序或在循环体内使用 break、exit等语句跳出循环)
示例
批量添加用户,用户名称以user开头
按数字顺序进行编号一共添加10个用户,即user1、user2、user10
初始密码均设为123123
u=1
#初始值
while [ $u -le 10 ]
#条件为真时,会一直循环执行,当变量u大于10时,会结束循环
do
useradd user$u
echo "123123"|passwd --stdin user$u &>>/dev/null
let u++
#每循环一次,变量u的值就会加1,当循环加到11时,while的判断条件为假
done
执行一下脚本看看结果
until语句
until 循环与 while 循环类似,while 循环能实现的脚本 until 同样也可以实现,但区别是while 循环在条件为真是继续执行循环,而 until 则是在条件为假时执行循环
8.双重循环和跳出循环
break跳出单个循环 break n 数字数字是几代表跳出n层循环
我们再做一个实验
当$i=5时,会跳出第一次循环,echo “------”命令还会执行
continue终止某次循环中的命令,但是不会完全终止命令
9.
echo的用法
选项 | 作用 |
---|---|
\r | 光标移至行首,并且不换行 |
\s | 当前shell的名称,如bash |
\t | 插入Tab键,制表符 |
\n | 输出换行 |
\f | 换行,但光标仍停留在原处 |
\ | 表示插入"\"本身转义 |
\b | 表示退格 不显示前一个字符 |
\c | 抑制更多的输出或不换行 |
99乘法表
# 外层循环变量j从1递增到9
for j in {1..9}
do
# 内层循环变量i从1递增到当前的j值
for i in `seq $j`
do
# 使用echo命令结合-e选项启用转义序列,并用\t插入制表符进行对齐
# \c表示不换行,使得同一行内可以连续输出多个结果
echo -e "${i}x${j}=$[i*j] \t\c"
done
# 当内层循环结束时(即完成一行输出后),执行一次换行
echo
done