shell脚本进阶

关于作者

周李杰,最后一批90后,现居湖北武汉

孤独患者,懒癌中期,无脑幻想者。但却人畜无害,无需远离。

兴趣众多,然无一精通。正努力成为一个有趣的人。

1
2
> print("👆以上是不完整的我") //请我吃大餐将会了解更多
>

[TOC]

bash条件判断

条件测试类型

条件测试分为整数测试字符测试文件测试

条件测试的表达式

1
2
3
[ echoes ]
[[ echoes ]]
test echoes

整数测试(双目)

-eq 测试两个整数是否相等

-ne 测试两个整数是否不等

-gt 测试一个数是否大于另一个数

-lt 测试一个数是否小于另一个数

-ge 大于或小于

-le 小于或等于

字符测试

== 等值比较,检查两边的内容是否一致,切记 == 两边要有空格

!= 检查两边内容是否不一致,不一致为真,一致为假

=~ 左侧字符穿能否被右侧的所匹配到,此表达式应用于双中括号[[]]中

-z “string” 测试指定字符串是否为空,空则为真,不空则为假
-n “string” 测试指定字符串是否不空,不空则为真,空则为假

文件测试

1
2
# 存在性测试
-e 测试文件是否存在
1
2
3
4
5
6
7
8
9
# 存在性及类别测试
-b 测试文件是否为块设备文件
-c 测试文件是否为字符设备文件
-f 测试文件是否为普通文件
-d 测试指定路径是否为目录
-h 测试文件是否为目录
-l 测试文件是否为符号链接文件
-p 测试文件是否为命名管道文件
-s 测试文件是否为套接字文件
1
2
3
4
# 文件权限测试
-r 测试当前用户对指定文件是否有读权限
-w 测试当前用户对指定文件是否有写入权限
-x 测试当前用户对指定文件是否有执行权限
1
2
3
4
# 文件特殊权限测试
-g 测试文件是否有sgid权限
-u 测试文件是否有suid权限
-k 测试文件是否有sticky权限
1
2
# 文件大小测试
-s 测试文件是否非空
1
2
# 文件是否打开测试
-t fd fd表示的文件描述是否已经打开并且与某终端相关
1
2
3
4
# 双目测试
file1 -ef file2 测试文件1与文件2是否为同一文件
file1 -ef file2 测试文件1是否比文件2新
file1 -ef file2 测试文件1是否比文件2旧
1
2
3
4
# 无分类
-N 测试文件自从上一次被录取之后是否被修改过
-O 测试文件是否存在并且被当前用户拥有
-G 测试文件是否存在并且默认组是否为当前用户组

组合测试条件

1
2
3
-a	与关系
-o 或关系
! 非关系

例如

1
2
3
4
5
# 总计个数 大于 1 与 总计个数 小于 3
[ $# -gt 1 -a $# -le 3 ]

# 总计个数 大于 1 后再次统计 总计个数 小于 3
[$# -gt 1 ] && [$# -le 3]

条件判断,控制结构

单分支if语句

1
2
3
4
5
if 判断条件;then
陈述1
陈述2
........
fi

双分支if语句

1
2
3
4
5
6
7
8
9
if 判断条件;then
陈述1
陈述2
.........
else
陈述1
陈述2
.........
fi
if语句小游戏
1
2
3
4
5
6
7
8
9
10
# ----------------猜数字-----------------
#!/bin/bash
num=50

read -p "请输入你所猜到的数字:" user_num
if [ $num -eq $user_num ];then
echo "哇瑟!好厉害!"
else
echo "你猜错了,哈哈哈"
fi

多分支if语句

1
2
3
4
5
6
7
8
9
10
11
12
13
if 判断条件1;then
陈述1
陈述2
.........
elif 判断条件2;then
陈述3
陈述4
.........
else
陈述5
陈述6
.........
fi

分支选择

1
2
3
4
5
6
7
8
9
10
11
12
13
14
case $变量名 in            
value1)
陈述
...
;;
value2)
陈述
...
;;
*)
陈述
...
;;
esac
1
2
3
4
5
另:case支持glob风格的通配符:
* 任意长度任意字符
? 任意单个字符
[] 指字范围内的任意单个字符
abc|bcd abc或bcd

循环语句

循环语句通常需要有一个进入条件和一个退出条件

  • for循环
  • while循环
  • until循环

for循环

for循环当列表不为空时进入循环,否则退出循环

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
for 变量 in 列表; do
循环体
done

for ((expr1;expr2;expr3))
{
循环体
}

for (( expr1 ; expr2 ; expr3 ));do
循环体
done

expr1 //用于指定初始条件,给控制变量一个初始值
expr2 //判定什么时候退出循环
expr3 //修正expr1指定的变量的值

//如何生成列表:
{1..100}
seq [起始数] [步进长度] 结束数

for循环取出/etc/passwd用户

1
2
3
4
5
6
7
8
9
10
#------取出/etc/passwd的用户以及UID---------
#!/bin/bash
Fa=/etc/passwd
for (( i=1;i<=$(cat $Fa | wc -l);i++ ));do
user_name=$(awk -F ':' "NR==$i {print $ 1}" $Fa)
user_UID=$(awk -F ':' "NR==$i {print $ 3}" $Fa)

echo "hello!$user_name,you UID is $user_UID."
done
echo "一共有$(cat $Fa | wc -l)个用户."

while循环

while循环适用于循环次数未知的场景,注意要有退出条件。
条件满足时进入循环,条件不满足了退出循环。

while循环正常用法

1
2
3
4
while 条件; do
陈述
...
done

while循环特殊用法

1
2
3
4
5
6
7
8
9
10
11
12
13
//while循环特殊用法一:死循环
while :;do
陈述
...
done

//这里的冒号可以改成任何非空值

while循环特殊用法二:逐行读取某文件,将值存入line变量中
while read line;do
陈述
...
done < /etc/passwd

#####while循环脚本

1
2
3
4
5
6
7
8
9
10
#-----while特殊用法二取用户-------
#! /bin/bash
Fa=/etc/passwd

while read line;do
user_name=$(echo $line | awk -F ':' 'NR==1 { print $1 }')
user_UID=$(echo $line | awk -F ':' 'NR==1 { print $3 }')
echo “hello! $user_name 您的UID是 $user_UID
echo -------------------------
done < $Fa
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#-------用while循环猜数字-------
#!/bin/bash

i=0
num=$[$RANDOM %100]

while :;do
((i++))
read -p "请输入一个数字" user_num
echo $user_num | egrep '^[0-9]+$' &> /dev/null
if [ $? -ne 0 ];then
echo "您输入的不是数字!请重试!"
exit
fi
if [ $user_num -gt $num ];then
echo "您输入的数字大了!"
elif [ $user_num -lt $num ];then
echo "您输入的数字小了!"
else
ehco "您输入正确!"
echo "您一共回答了$i次."
exit
fi
done

until循环

条件不满足时进入循环,条件满足了退出循环。

1
2
3
4
until 条件; do
陈述
...
done

循环语句特殊情况

break [num]:提前退出循环。当循环语句中出现break时,将提前退出循环,不再执行循环后面的语句

continue [num]:提前结束本轮循环而进入下一轮循环。当循环语句执行到continue时,continue后面的语句将不再执行,提前进入下一轮循环

定义脚本退出状态码

1
2
3
4
5
6
7
//exit命令用于定义执行状态结果

exit # //此处的#号是一个数字,其范围可以是0-255

如果脚本没有明确定义退出状态码,那么,最后执行的一条命令的退出码即为脚本的退出状态码

注意:脚本中一旦遇到exit命令,脚本会立即终止
打赏
  • © 2019-2020 Li Jie
  • Powered by Hexo Theme Ayer
    • PV:
    • UV:

喜欢就打赏吧~

支付宝
微信