逻辑结构
1. while ...do ... done , break , continue
while后面的条件为 真 或者 true,循环体就会继续循环,否则终止循环
猜数字
写脚本 :猜数字
#!/bin/bash
X=$(($RANDOM%21))
while [ true ]
do
read -p "请猜我这个随机数是什么(0-20): " Y
if [ $Y -eq $X ]
then
break
elif [ $Y -gt $X ]
then
echo "大了"
continue
else
echo "小了"
continue
fi
done
echo "你猜对了"
运行脚本
[root@localhost ~]# sh num.sh
请猜我这个随机数是什么(0-20): 7
小了
请猜我这个随机数是什么(0-20): 14
小了
请猜我这个随机数是什么(0-20): 19
大了
请猜我这个随机数是什么(0-20): 18
大了
请猜我这个随机数是什么(0-20): 17
你猜对了
[root@localhost ~]#
2. if ...elif...elif...fi
摇骰子猜大小
写脚本
#!/bin/sh
a=0
while [ $a -lt 5 ]
do
read -p "买大买小买定离手:" P
random=$(($RANDOM%6+1))
if [ "$random" -le "3" ] && [ "$P" == "小" ];then
echo "开的点数是:$random 恭喜你猜对了"
elif [ "$random" -gt "3" ] && [ "$P" == "大" ];then
echo "开的点数是:$random 恭喜你猜对了"
elif [ "$random" -le "3" ] && [ "$P" == "大" ];then
echo "开的点数是:$random 很遗憾猜错了"
elif [ "$random" -gt "3" ] && [ "$P" == "小" ];then
echo "开的点数是:$random 很遗憾猜错了"
fi
let a++
done
运行
[root@localhost ~]# sh ysz.sh
买大买小买定离手:大
开的点数是:4 恭喜你猜对了
买大买小买定离手:小
开的点数是:6 很遗憾猜错了
买大买小买定离手:大
开的点数是:5 恭喜你猜对了
买大买小买定离手:大
开的点数是:1 很遗憾猜错了
买大买小买定离手:大
开的点数是:6 恭喜你猜对了
[root@localhost ~]#
3. for ..do..done 嵌套循环
脚本
#!/bin/sh
for X in {1..9}
do
for Y in {1..9}
do
if [ $X == $Y ];then
break
fi
done
echo "$X$Y"
echo "----------------"
done
运行
[root@mysql-slave ~]# sh b.sh
11
----------------
22
----------------
33
----------------
44
----------------
55
----------------
66
----------------
77
----------------
88
----------------
99
----------------
[root@mysql-slave ~]#
4. case...esac
写脚本
#!/bin/sh
n=0
while [ $n -lt 3 ]
do
read -p "请输入一个常见的状态码,我来给你解释:" X
case $X in
"200")
echo "请求成功"
;;
"400")
echo "语法错误"
;;
"401")
echo "请求未经授权"
;;
"403")
echo "没有权限"
;;
"404")
echo "资源不存在,路径错误"
;;
"500")
echo "服务器内部错误"
;;
*)
echo "我也不知道"
;;
esac
let n++
done
运行
[root@mysql-slave ~]# sh c.sh
请输入一个常见的状态码,我来给你解释:403
没有权限
请输入一个常见的状态码,我来给你解释:9797
我也不知道
请输入一个常见的状态码,我来给你解释:404
资源不存在,路径错误
[root@mysql-slave ~]#
awk----编程语言
-语法
awk [options] 'commands' filenames
-F 指定分隔符,默认是空白字符
查看进程
[root@localhost ~]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.6 128164 6816 ? Ss 08:57 0:02 /usr/lib/systemd/
root 2 0.0 0.0 0 0 ? S 08:57 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 08:57 0:00 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S< 08:57 0:00 [kworker/0:0H]
写脚本:统计使用的内存
#!/bin/sh
num=0
for X in $(ps aux | awk '{print $6}'| grep -v "RSS")
do
num=$[ $num + $X ]
done
echo "内存已使用:$num kb"
运行
[root@localhost ~]# sh mem.sh
内存已使用:329216 kb
数组
定义数组
test=(id name age sex)
索引: 0 1 2 3
[root@mysql-slave ~]# echo ${test[3]}
sex
declare 声明关联数组
语法:# declare -A 数组名称
[shark@sharkyun ~]$ declare -A test
添加值 ,每个值之间用 空格 隔开
[root@mysql-slave ~]# test=(["id"]="2" ["name"]="jack" ["age"]="20")
[root@mysql-slave ~]# echo ${test[age]}
20
[root@mysql-slave ~]# echo ${test[name]}
jack
[root@mysql-slave ~]# test[english]=60
[root@mysql-slave ~]# echo ${test[english]}
60
[root@mysql-slave ~]# echo ${test[*]}
60 jack 20 2
[root@mysql-slave ~]# test=(["chines"]="90")
[root@mysql-slave ~]# echo ${test[*]}
90
[root@mysql-slave ~]#
获取所有的 索引号:
echo ${!test[*]}
统计数组中有多少个键值对
echo ${#test[*]}
删除索引
unset test[id]
预习 sed
sed在处理文本时是逐行读取文件内容,读到匹配的行就根据指令做操作,不匹配就跳过。
sed是Linux下一款功能强大的非交互流式文本编辑器,可以对文本文件进行增、删、改、查等操作,支持按行、按字段、按正则匹配文本内容,灵活方便,特别适合于大文件的编辑
调用sed 命令的语法:
在命令行指定sed指令对文本进行处理:sed 选项 ‘指令’ 文件
sed的常用选项:
-e:它告诉sed将下一个参数解释为一个sed指令,只有当命令行上给出多个sed指令时才需要使用-e选项
-f:后跟保存了sed指令的文件
-i:直接对内容进行修改,不加-i时默认只是预览,不会对文件做实际修改
-n:取消默认输出,sed默认会输出所有文本内容,使用-n参数后只显示处理过的行
sed中的编辑命令:
a:追加 向匹配行后面插入内容
c:更改 更改匹配行的内容
i:插入 向匹配行前插入内容
d:删除 删除匹配的内容
s:替换 替换掉匹配的内容
p:打印 打印出匹配的内容,通常与-n选项和用
=:用来打印被匹配的行的行号
n:读取下一行,遇到n时会自动跳入下一行
r,w:读和写编辑命令,r用于将内容读入文件,w用于将匹配内容写入到文件
sed命令操作
1.向文件中添加或插入行
sed '3ahello' a.txt #向第三行后面添加hello,3表示行号
[root@localhost ~]# cat a.txt
a
bc
123
def
123 123
kkk
[root@localhost ~]# sed '3ahello' a.txt
a
bc
123
hello
def
123 123
kkk
sed '/123/ateemo' b.txt #向内容123后面添加teemo,如果文件中有多行包括123,则每一行后面都会添加
[root@localhost ~]# cat b.txt
a
bc
123
def
123 123
kkk
[root@localhost ~]# sed '/123/ateemo' b.txt
a
bc
123
teemo
def
123 123
teemo
kkk
sed '$ihello' c.txt #在最后一行之前插入hello
[root@localhost ~]# cat c.txt
a
bc
123
def
123 123
kkk
[root@localhost ~]# sed '$ihello' c.txt
a
bc
123
def
123 123
hello
kkk
2.更改文件中指定的行
sed '1ckill' d.txt #将文件d.txt的第一行替换为kill
[root@localhost ~]# cat d.txt
a
bc
123
def
123 123
kkk
[root@localhost ~]# sed '1ckill' d.txt
kill
bc
123
def
123 123
kkk
3.删除文件中的行
sed '1~2d' f.txt #从第一行开始删除,每隔2行就删掉一行,即删除奇数行
[root@localhost ~]# cat f.txt
a
bc
123
def
123 123
kkk
[root@localhost ~]# sed '1~2d' f.txt
bc
def
kkk
sed '1,3d' f.txt #删除1~3行
sed '1,3!d' f.txt #删除1~3之外的所有行
sed '/123/d' f.txt #删除匹配123的行