Shell-day03
1. 昨日回顾
Shell变量赋值
Read的语法示例
read -p
read示例脚本测试IP地址是否通畅
Read修改主机名脚本
Read修改IP地址脚本
Shell变量替换
${#变量} #变量值的长度
${变量#匹配规则} #从头开始匹配,最短删除
${变量##匹配规则} #从头开始匹配,最长删除
${变量%匹配规则} #从尾开始匹配,最短删除
${变量%%匹配规则} #从尾开始匹配,最长删除
${变量/旧的字符串/新的字符串} #替换变量中的旧的字符串为新的字符串,只替换匹配的第一个
${变量//旧的字符串/新的字符串} #替换变量中的旧的字符串为新的字符串,替换所有
${变量:匹配规则:匹配规则} #索引切片 第一个数字为索引的编号从0开始 第二个数字是取的个数
变量替换案例:监控内存的使用率
变量替换案例:备份场景案例
4. 在/backup下创建10个.txt的文件,提前创建好,找到/backup目录下所有后缀名为.txt的文件
1)批量修改txt为txt.bak
2)把所有的.bak文件打包压缩为123.tar.gz
3)批量还原文件的名字,及把增加的.bak再删除
5. 取出下列字符串长度小于3的单词,I am qiuzengjia teacher I am 18。
2. 根据下方提示完成脚本
在/backup下创建10个.txt的文件,提前创建好,找到/backup目录下所有后缀名为.txt的文件
[root@shell /service/scripts/day03]# find /backup/ -name "*.txt"
/backup/file-1.txt
/backup/file-2.txt
/backup/file-3.txt
/backup/file-4.txt
/backup/file-5.txt
/backup/file-6.txt
/backup/file-7.txt
/backup/file-8.txt
/backup/file-9.txt
/backup/file-10.txt
1)批量修改txt为txt.bak
2)把所有的.bak文件打包压缩为123.tar.gz
3)批量还原文件的名字,及把增加的.bak再删除
#第一种方法
[root@shell /service/scripts/day03]# cat sed.sh
#!/bin/bash
#找到所有.txt为结尾的文件并进行重命名
find /backup/ -name "*.txt" | sed -r 's#(.*)#mv \1 \1.bak#g' | bash &>/dev/null
if [ $? -eq 0 ];then
echo "所有以.txt为结尾的文件重命名成功...."
else
echo "所有以.txt为结尾的文件重命名失败...."
exit
fi
#把所有的.bak文件打包压缩为123.tar.gz
tar czPf /backup/123.tar.gz $(find /backup/ -name "*.bak") &>/dev/null
if [ $? -eq 0 ];then
echo "所有以.bak为结尾的文件打包压缩成功...."
else
echo "所有以.bak为结尾的文件打包压缩失败...."
exit
fi
#还原名称
find /backup/ -name "*.bak" | sed -r 's#(.*)(\.bak)#mv \1\2 \1#g' | bash &>/dev/null
if [ $? -eq 0 ];then
echo "文件名称还原成功...."
else
echo "文件名称失败...."
exit
fi
#输出脚本是否执行成功
echo "脚本执行成功!过程没有报错!"
[root@shell /service/scripts/day03]# sh sed.sh
所有以.txt为结尾的文件重命名成功....
所有以.bak为结尾的文件打包压缩成功....
文件名称还原成功....
脚本执行成功!过程没有报错!
[root@shell /service/scripts/day03]# ll /backup/*txt
-rw-r--r-- 1 root root 0 2020-04-22 08:50 /backup/file-10.txt
-rw-r--r-- 1 root root 0 2020-04-22 08:50 /backup/file-1.txt
-rw-r--r-- 1 root root 0 2020-04-22 08:50 /backup/file-2.txt
-rw-r--r-- 1 root root 0 2020-04-22 08:50 /backup/file-3.txt
-rw-r--r-- 1 root root 0 2020-04-22 08:50 /backup/file-4.txt
-rw-r--r-- 1 root root 0 2020-04-22 08:50 /backup/file-5.txt
-rw-r--r-- 1 root root 0 2020-04-22 08:50 /backup/file-6.txt
-rw-r--r-- 1 root root 0 2020-04-22 08:50 /backup/file-7.txt
-rw-r--r-- 1 root root 0 2020-04-22 08:50 /backup/file-8.txt
-rw-r--r-- 1 root root 0 2020-04-22 08:50 /backup/file-9.txt
[root@shell /service/scripts/day03]# ll /backup/123.tar.gz
-rw-r--r-- 1 root root 209 2020-04-22 09:10 /backup/123.tar.gz
[root@shell /service/scripts/day03]# tar tf /backup/123.tar.gz
tar: Removing leading `/' from member names
/backup/file-1.txt.bak
/backup/file-2.txt.bak
/backup/file-3.txt.bak
/backup/file-4.txt.bak
/backup/file-5.txt.bak
/backup/file-6.txt.bak
/backup/file-7.txt.bak
/backup/file-8.txt.bak
/backup/file-9.txt.bak
/backup/file-10.txt.bak
awk
for循环加mv命令
[root@shell /service/scripts/day03]# cat for.sh
#!/bin/bash
#批量修改txt为txt.bak
for i in $(find /backup/ -name "*.txt")
do
mv $i ${i}.bak
done
if [ $? -eq 0 ];then
echo "所有以.txt为结尾的文件重命名成功...."
else
echo "所有以.txt为结尾的文件重命名失败...."
exit
fi
#把所有的.bak文件打包压缩为123.tar.gz
tar czPf /backup/123.tar.gz $(find /backup/ -name "*.bak") &>/dev/null 打包使用-p参数不会出现删根提示
if [ $? -eq 0 ];then
echo "所有以.bak为结尾的文件打包压缩成功...."
else
echo "所有以.bak为结尾的文件打包压缩失败...."
exit
fi
#还原名称
for n in $(find /backup/ -name "*.bak")
do
mv $n ${n%.*}
done
if [ $? -eq 0 ];then
echo "文件名称还原成功...."
else
echo "文件名称失败...."
exit
fi
#输出脚本是否执行成功
echo "脚本执行成功!过程没有报错!"
[root@shell /service/scripts/day03]# sh for.sh
所有以.txt为结尾的文件重命名成功....
所有以.bak为结尾的文件打包压缩成功....
文件名称还原成功....
脚本执行成功!过程没有报错!
3. 判断字符串长度
取出下列字符串长度小于3的单词,I am qiuzengjia teacher I am 18。
[root@shell /service/scripts/day03]# echo I am qiuzengjia teacher I am 18 | xargs -n1 | awk '{if(length<3)print}'
I
am
I
am
18
[root@shell /service/scripts/day03]# cat length.sh
#!/bin/bash
for i in I am qiuzengjia teacher I am 18
do
if [ ${#i} -lt 3 ];then #lt 表示小于 ne表示不等于 eq 表示等于 gt表示大于
echo $i
fi
done
[root@shell /service/scripts/day03]# sh length.sh
I
am
I
am
18
[root@shell /service/scripts/day03]# vim length.sh
[root@shell /service/scripts/day03]# cat length.sh
#!/bin/bash
for i in I am qiuzengjia teacher I am 18
do
if [ ${#i} -gt 3 ];then
echo $i
fi
done
[root@shell /service/scripts/day03]# sh length.sh
qiuzengjia
teacher
[root@shell /service/scripts/day03]# cat length.sh
#!/bin/bash
for i in I am qiuzengjia teacher I am 18
do
length=$(echo $i | wc -L)
if [ $length -lt 3 ];then
echo $i
fi
done
[root@shell /service/scripts/day03]# sh length.sh
I
am
I
am
18
4. Shell的变量运算
加减乘除 求余 求方
Num1 + Num2
-
*
/
%
^
5. 整数运算
expr $(()) $[] let 不支持小数运算
expr 有语法格式 两数和操作符之间必须要有空格,当第一个数为空值时,计算不会报错,当最后一个为空值时会报错
不能进行求方运算,乘的操作符需要转义
[root@shell /service/scripts/day03]# Num1=20
[root@shell /service/scripts/day03]# Num2=5
[root@shell /service/scripts/day03]# expr $Num1 + $Num2
25
[root@shell /service/scripts/day03]# expr $Num1 +$Num2
expr: syntax error
[root@shell /service/scripts/day03]# expr $Num1 +
expr: syntax error
[root@shell /service/scripts/day03]# expr + $Num2
5
[root@shell /service/scripts/day03]# expr $Num1 - $Num2
15
[root@shell /service/scripts/day03]# expr $Num1 * $Num2
expr: syntax error
[root@shell /service/scripts/day03]# expr $Num1 \* $Num2
100
[root@shell /service/scripts/day03]# expr $Num1 / $Num2
4
[root@shell /service/scripts/day03]# expr $Num1 % $Num2
0
[root@shell /service/scripts/day03]# expr $Num1 ^ $Num2
expr: syntax error
$(()) 没有严格的语法说明,不能求方 当第一个数为空值时,计算不会报错,当最后一个为空值时会报错
[root@shell /service/scripts/day03]# echo $(($Num1+$Num2))
25
[root@shell /service/scripts/day03]# echo $(($Num1-$Num2))
15
[root@shell /service/scripts/day03]# echo $(($Num1*$Num2))
100
[root@shell /service/scripts/day03]# echo $(($Num1/$Num2))
4
[root@shell /service/scripts/day03]# echo $(($Num1%$Num2))
0
[root@shell /service/scripts/day03]# echo $(($Num1^$Num2))
17
[root@shell /service/scripts/day03]# echo $(($Num1+))
-bash: 20+: syntax error: operand expected (error token is "+")
[root@shell /service/scripts/day03]# echo $((+$Num2))
5
$[] 没有严格的语法说明,不能求方 当第一个数为空值时,计算不会报错,当最后一个为空值时会报错
[root@shell /service/scripts/day03]# echo $[$Num1+$Num2]
25
[root@shell /service/scripts/day03]# echo $[$Num1-$Num2]
15
[root@shell /service/scripts/day03]# echo $[$Num1*$Num2]
100
[root@shell /service/scripts/day03]# echo $[$Num1/$Num2]
4
[root@shell /service/scripts/day03]# echo $[$Num1%$Num2]
0
[root@shell /service/scripts/day03]# echo $[$Num1^$Num2]
17
[root@shell /service/scripts/day03]# echo $[+$Num2]
5
[root@shell /service/scripts/day03]# echo $[$Num1+]
-bash: 20+: syntax error: operand expected (error token is "+")
#$(()) $[] expr 共同点:第一个值可以为空,最后一个值不能为空,为空时会报错,不能求方,只能整数运算。
let 计数
[root@shell /service/scripts/day03]# let Num3=$Num1+$Num2
[root@shell /service/scripts/day03]# echo $Num3
25
[root@shell /service/scripts/day03]# a=1
[root@shell /service/scripts/day03]# let a++
[root@shell /service/scripts/day03]# let a++
[root@shell /service/scripts/day03]# let a++
[root@shell /service/scripts/day03]# echo $a
4
[root@shell /service/scripts/day03]# let a--
[root@shell /service/scripts/day03]# let a--
[root@shell /service/scripts/day03]# echo $a
2
6. 小数运算
awk bc Python
bc 命令 可以求方运算
[root@shell /service/scripts/day03]# yum install -y bc
[root@shell /service/scripts/day03]# bc #交互式运算一般hen少使用
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
20+10
30
$Num1+$Num2
(standard_in) 2: illegal character: $
(standard_in) 2: illegal character: N
(standard_in) 2: illegal character: $
(standard_in) 2: illegal character: N
20/3 #这样计算小数时错误的
6
^C
(interrupt) Exiting bc.
#bc 计算时变量和计算符号之间无需加空格
[root@shell /service/scripts/day03]# echo $Num1+$Num2 | bc
25
[root@shell /service/scripts/day03]# echo $Num1-$Num2 | bc
15
[root@shell /service/scripts/day03]# echo $Num1*$Num2 | bc
100
[root@shell /service/scripts/day03]# echo $Num1/$Num2 | bc
4
[root@shell /service/scripts/day03]# Num2=6
[root@shell /service/scripts/day03]# echo $Num1/$Num2 | bc
3
[root@shell /service/scripts/day03]# echo "scale=2;$Num1/$Num2" | bc #求小数要加上 scale scale=2 表示保留2位小数。
3.33
[root@shell /service/scripts/day03]# echo "scale=1;$Num1/$Num2" | bc
3.3
[root@shell /service/scripts/day03]# echo "scale=10;$Num1/$Num2" | bc
3.3333333333
[root@shell /service/scripts/day03]# echo $Num1%$Num2 | bc
2
[root@shell /service/scripts/day03]# echo $Num1^$Num2 | bc #可以求方运算
64000000
awk
[root@shell /service/scripts/day03]# awk 'BEGIN{print 20+6}'
26
[root@shell /service/scripts/day03]# awk 'BEGIN{print 20-6}'
14
[root@shell /service/scripts/day03]# awk 'BEGIN{print 20*6}'
120
[root@shell /service/scripts/day03]# awk 'BEGIN{print 20/6}'
3.33333
[root@shell /service/scripts/day03]# awk 'BEGIN{print 20^6}'
64000000
[root@shell /service/scripts/day03]# awk 'BEGIN{print 20%6}'
2
[root@shell /service/scripts/day03]# awk 'BEGIN{print $Num1+$Num2}' #注意awk在计算变量时使用双引号否者无法解析变量
0
[root@shell /service/scripts/day03]# awk "BEGIN{print $Num1+$Num2}"
26
[root@shell /service/scripts/day03]# awk -vnum1=10 -vnum2=5 'BEGIN{print num1+num2}' #使用-v设置awk内置变量
15
[root@shell /service/scripts/day03]# awk 'BEGIN{print 20/6}'
3.33333
[root@shell /service/scripts/day03]# awk 'BEGIN{print 20/7}'
2.85714
[root@shell /service/scripts/day03]# awk 'BEGIN{print 20/30}'
0.666667
[root@shell /service/scripts/day03]# awk 'BEGIN{print 1/2}'
0.5
[root@shell /service/scripts/day03]# awk 'BEGIN{printf "%.2f\n",1/2}'
0.50
[root@shell /service/scripts/day03]# awk 'BEGIN{printf "%.2f\n",10/3}' 这里的2表示小数点位数 n表示换行,注意使用双引号引起,单引号会报语法错误。
3.33
python
[root@shell /service/scripts/day03]# python #交互式运算
Python 2.7.5 (default, Oct 30 2018, 23:45:53)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-36)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 20+10
30
>>> 20/6
3
>>> 20.0/6
3.3333333333333335
>>>
KeyboardInterrupt
>>> quit()
[root@shell /service/scripts/day03]# echo "print $Num1+$Num2" |python
26
[root@shell /service/scripts/day03]# echo "print $Num1-$Num2" |python
14
[root@shell /service/scripts/day03]# echo "print $Num1*$Num2" |python
120
[root@shell /service/scripts/day03]# echo "print $Num1/$Num2" |python
3
[root@shell /service/scripts/day03]# echo "print ${Num1}.0/$Num2" |python #计算小数时要加.0
3.33333333333
[root@shell /service/scripts/day03]# echo "print ${Num1}^$Num2" |python
18
7. 变量运算案例
[root@shell /service/scripts/day03]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 125712 2080 ? Ss Apr20 0:02 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root 2 0.0 0.0 0 0 ? S Apr20 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S Apr20 0:01 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S< Apr20 0:00 [kworker/0:0H]
root 7 0.0 0.0 0 0 ? S Apr20 0:00 [migration/0]
root 8 0.0 0.0 0 0 ? S Apr20 0:00 [rcu_bh]
root 9 0.0 0.0 0 0 ? R Apr20 0:01 [rcu_sched]
root 10 0.0 0.0 0 0 ? S< Apr20 0:00 [lru-add-drain]
root 11 0.0 0.0 0 0 ? S Apr20 0:00 [watchdog/0]
root 13 0.0 0.0 0 0 ? S Apr20 0:00 [kdevtmpfs]
第一种方法
[root@shell /service/scripts/day03]# ps aux | awk 'NR>1{print $5}' | tr '\n' '+' | sed -r 's#(.*)\+#\1\n#g' |bc
4681212 #\n 表示换行符
[root@shell /service/scripts/day03]# ps aux | awk 'NR>1{print $5}' | xargs | tr ' ' '+' |bc
4672524
[root@shell /service/scripts/day03]# ps aux | awk 'NR>1{print $5}' | xargs | tr ' ' '+' |bc | awk '{print $1/1024/1024"MB"}'
4.56435MB
第二种方法:
[root@shell /service/scripts/day03]# ps aux| awk 'NR>1{he+=$5}END{print he}'
4353420
编写一个简单的计算器
要求:
执行脚本:
请输入第一个数字:20
请输入第二个数字:10
20 + 10 = 30
20 - 10 = 10
20 * 10 = 200
20 / 10 = 2
[root@shell /service/scripts/day03]# cat jsq.sh
#!/bin/bash
#提示用户输入第一个数字
read -p "请输入第一个你要运算的数字:" Num1
#提示用户输入第二个数字
read -p "请输入第二个你要运算的数字:" Num2
echo "$Num1 和 $Num2 两个数字的加减乘除运算结果如下:"
echo "$Num1 + $Num2 = $(($Num1+$Num2))"
echo "$Num1 - $Num2 = $(($Num1-$Num2))"
echo "$Num1 * $Num2 = $(($Num1*$Num2))"
echo "$Num1 / $Num2 = $(($Num1/$Num2))"
[root@shell /service/scripts/day03]# sh jsq.sh
请输入第一个你要运算的数字:10
请输入第二个你要运算的数字:10
10 和 10 两个数字的加减乘除运算结果如下:
10 + 10 = 20
10 - 10 = 0
10 * 10 = 100
10 / 10 = 1
[root@shell /service/scripts/day03]# cat jsq.sh
#!/bin/bash
#提示用户输入第一个数字
read -p "请输入第一个你要运算的数字:" Num1
#提示用户输入第二个数字
read -p "请输入第二个你要运算的数字:" Num2
echo "$Num1 和 $Num2 两个数字的加减乘除运算结果如下:"
echo "$Num1 + $Num2 = $(($Num1+$Num2))"
echo "$Num1 - $Num2 = $(($Num1-$Num2))"
echo "$Num1 * $Num2 = $(($Num1*$Num2))"
echo "$Num1 / $Num2 = $(awk "BEGIN{print $Num1/$Num2}")"
[root@shell /service/scripts/day03]# sh jsq.sh
请输入第一个你要运算的数字:10
请输入第二个你要运算的数字:20
10 和 20 两个数字的加减乘除运算结果如下:
10 + 20 = 30
10 - 20 = -10
10 * 20 = 200
10 / 20 = 0.5
#加判断条件
[root@shell /service/scripts/day03]# cat jsq.sh
#!/bin/bash
#提示用户输入第一个数字
read -p "请输入第一个你要运算的数字:" Num1
expr 1 + $Num1 &>/dev/null
if [ $? -eq 0 ];then
echo "你输入的第一个值满足运算条件"
else
echo "你输入的第一个值不满足条件,请重新输入!"
exit
fi
#提示用户输入第二个数字
read -p "请输入第二个你要运算的数字:" Num2
expr 1 + $Num2 &>/dev/null
if [ $? -eq 0 ];then
echo "你输入的第二个值满足运算条件"
else
echo "你输入的第二个值不满足条件,请重新输入!"
exit
fi
#运算结果
echo "$Num1 和 $Num2 两个数字的加减乘除运算结果如下:"
echo "$Num1 + $Num2 = $(($Num1+$Num2))"
echo "$Num1 - $Num2 = $(($Num1-$Num2))"
echo "$Num1 * $Num2 = $(($Num1*$Num2))"
echo "$Num1 / $Num2 = $(awk "BEGIN{print $Num1/$Num2}")"
[root@shell /service/scripts/day03]# sh jsq.sh
请输入第一个你要运算的数字:a
你输入的第一个值不满足条件,请重新输入!
[root@shell /service/scripts/day03]# sh jsq.sh
请输入第一个你要运算的数字:0.5
你输入的第一个值不满足条件,请重新输入!
[root@shell /service/scripts/day03]# sh jsq.sh
请输入第一个你要运算的数字:1
你输入的第一个值满足运算条件
请输入第二个你要运算的数字:a
你输入的第二个值不满足条件,请重新输入!
[root@shell /service/scripts/day03]# sh jsq.sh
请输入第一个你要运算的数字:1
你输入的第一个值满足运算条件
请输入第二个你要运算的数字:1
你输入的第二个值满足运算条件
1 和 1 两个数字的加减乘除运算结果如下:
1 + 1 = 2
1 - 1 = 0
1 * 1 = 1
1 / 1 = 1
8. Shell的变量案例
01. 使用Shell脚本打印,系统版本、内核版本平台、虚拟平台、静态主机名、eth0网卡IP地址、lo网卡IP地址、当前主机的外网IP地址curl icanhazip.com
i
[root@shell /service/scripts/day03]# cat var.sh
#!/bin/bash
#定义变量
System_Version=$(awk -F '[ .]' '{print $1,$4"."$5}' /etc/redhat-release)
Kernel_Version=$(uname -r | cut -c 1-10)
Virtualization=$(hostnamectl | awk '/Virtualization/{print $2}')
Static_Hostname=$(hostnamectl | awk '/Static/{print $3}')
Eth0=$(ifconfig eth0 | awk 'NR==2{print $2}')
Lo=$(ifconfig lo | awk 'NR==2{print $2} ')
Wan=$(curl -s ifconfig.me) #curl -s ifconfig.me 查询当前主机的外网上网IP地址
#打印结果
echo "当前系统的版本为:$System_Version"
echo "当前系统的内核版本为:$Kernel_Version"
echo "当前系统虚拟化平台为:$Virtualization"
echo "当前系统静态主机名为:$Static_Hostname"
echo "系统的Eth0网卡IP地址为:$Eth0"
echo "系统的Lo网卡IP地址为:$Lo"
echo "当前系统的外网IP地址:$Wan"
[root@shell /service/scripts/day03]# sh var.sh
当前系统的版本为:CentOS 7.6
当前系统的内核版本为:3.10.0-957
当前系统虚拟化平台为:vmware
当前系统静态主机名为:shell
系统的Eth0网卡IP地址为:10.0.0.81
系统的Lo网卡IP地址为:127.0.0.1
当前系统的外网IP地址:183.192.140.109
02. 需求描述:变量string="Bigdata process is Hadoop, Hadoop is open source project",执行脚本后,打印输出string变量,并给出用户以下选项:
#需求
1)打印string长度
2)删除字符串中所有的Hadoop
3)替换第一个Hadoop为Linux
4)替换全部Hadoop为Linux
用户请输入数字1|2|3|4,可以执行对应项的功能。
[root@shell /service/scripts/day03]#
[root@shell /service/scripts/day03]# cat var-1.sh
#!/bin/bash
String="Bigdata process is Hadoop, Hadoop is open source project"
echo $String
#定义菜单
cat<<EOF
#############################
1)打印string长度
2)删除字符串中所有的Hadoop
3)替换第一个Hadoop为Linux
4)替换全部Hadoop为Linux
#############################
EOF
#提示用户按要求操作
read -p "请输入数字1|2|3|4,可以执行对应选项的功能:" Num
#判断用户输入的是否为数字
expr 1 + $Num &>/dev/null
if [ $? -ne 0 ];then
echo "你输入的不是一个数字!请重新输入!"
exit
fi
#根据用户的输入进行执行对应的命令
if [ $Num -eq 1 ];then
echo "变量String的长度为:${#String}"
exit
fi
if [ $Num -eq 2 ];then
echo "删除字符串中所有的Hadoop,结果如下:"
echo "${String//Hadoop/}"
exit
fi
if [ $Num -eq 3 ];then
echo "替换第一个Hadoop为Linux,结果如下:"
echo "${String/Hadoop/Linux}"
exit
fi
if [ $Num -eq 4 ];then
echo "替换全部Hadoop为Linux"
echo "${String//Hadoop/Linux}"
else
echo "你输入的数字不符合要求!请输入数字1|2|3|4"
fi
[root@shell /service/scripts/day03]# sh var-1.sh
Bigdata process is Hadoop, Hadoop is open source project
#############################
1)打印string长度
2)删除字符串中所有的Hadoop
3)替换第一个Hadoop为Linux
4)替换全部Hadoop为Linux
#############################
请输入数字1|2|3|4,可以执行对应选项的功能:a
你输入的不是一个数字!请重新输入!
[root@shell /service/scripts/day03]# sh var-1.sh
Bigdata process is Hadoop, Hadoop is open source project
#############################
1)打印string长度
2)删除字符串中所有的Hadoop
3)替换第一个Hadoop为Linux
4)替换全部Hadoop为Linux
#############################
请输入数字1|2|3|4,可以执行对应选项的功能:5
你输入的数字不符合要求!请输入数字1|2|3|4
[root@shell /service/scripts/day03]# sh var-1.sh
Bigdata process is Hadoop, Hadoop is open source project
#############################
1)打印string长度
2)删除字符串中所有的Hadoop
3)替换第一个Hadoop为Linux
4)替换全部Hadoop为Linux
#############################
请输入数字1|2|3|4,可以执行对应选项的功能:1
变量String的长度为:56
[root@shell /service/scripts/day03]# sh var-1.sh
Bigdata process is Hadoop, Hadoop is open source project
#############################
1)打印string长度
2)删除字符串中所有的Hadoop
3)替换第一个Hadoop为Linux
4)替换全部Hadoop为Linux
#############################
请输入数字1|2|3|4,可以执行对应选项的功能:2
删除字符串中所有的Hadoop,结果如下:
Bigdata process is , is open source project
[root@shell /service/scripts/day03]# sh var-1.sh
Bigdata process is Hadoop, Hadoop is open source project
#############################
1)打印string长度
2)删除字符串中所有的Hadoop
3)替换第一个Hadoop为Linux
4)替换全部Hadoop为Linux
#############################
请输入数字1|2|3|4,可以执行对应选项的功能:3
替换第一个Hadoop为Linux,结果如下:
Bigdata process is Linux, Hadoop is open source project
[root@shell /service/scripts/day03]# sh var-1.sh
Bigdata process is Hadoop, Hadoop is open source project
#############################
1)打印string长度
2)删除字符串中所有的Hadoop
3)替换第一个Hadoop为Linux
4)替换全部Hadoop为Linux
#############################
请输入数字1|2|3|4,可以执行对应选项的功能:4
替换全部Hadoop为Linux
Bigdata process is Linux, Linux is open source project
9. 流程控制语句if概述
1. 单分支
if [ 如果你有房 ];then 如果 条件 则
就嫁给你
fi
[root@shell /service/scripts/day03]# cat if-1.sh
#!/bin/bash
if [ 1 -lt 2 ];then
echo "1 < 2"
fi
[root@shell /service/scripts/day03]# sh if-1.sh
1 < 2
[root@shell /service/scripts/day03]# vim if-1.sh
[root@shell /service/scripts/day03]# cat if-1.sh
#!/bin/bash
if ls /root &>/dev/null;then #if语句if后可以写[] 也可以直接写命令 当命令为真时才执行后面的内容。
echo "root目录存在"
fi
[root@shell /service/scripts/day03]# sh if-1.sh
root目录存在
2. 双分支
if [ 如果你有房 ];then 如果 条件 则 否则
嫁给你
else
拜拜
fi
[root@shell /service/scripts/day03]# cat if-1.sh
#!/bin/bash
if ls /root &>/dev/null;then
echo "root目录存在"
else
echo "root目录不存在"
fi
[root@shell /service/scripts/day03]# sh if-1.sh
root目录存在
[root@shell /service/scripts/day03]# mv /root roo
[root@shell /service/scripts/day03]# sh if-1.sh
root目录不存在
[root@shell /service/scripts/day03]# mv roo/ /root
[root@shell /service/scripts/day03]# cat if-1.sh
#!/bin/bash
if [ 1 -lt 2 ];then
echo "1 < 2"
else
echo "1 > 2"
fi
[root@shell /service/scripts/day03]# sh if-1.sh
1 < 2
[root@shell /service/scripts/day03]# vim if-1.sh
[root@shell /service/scripts/day03]# cat if-1.sh
#!/bin/bash
if [ 3 -lt 2 ];then
echo "1 < 2"
else
echo "1 > 2"
fi
[root@shell /service/scripts/day03]# sh if-1.sh
1 > 2
3. 多分支
if [ 如果你有房 ];then 如果 条件 则 或者 条件 则 ... 否则
嫁给你
elif [ 你有钱 ];then
嫁给你
elif [ 你长的帅 ];then
尝试交往
elif [ 你在老男孩学习Linux ];then
倒贴也跟你
else
真的拜拜
fi
判断一个用户是否存在该系统
[root@shell /service/scripts/day03]# cat if-2.sh
#!/bin/bash
#提示用户输入一个要进行查询的用户
read -p "请输入你要查询的用户:" User
#进行检测该用户是否存在系统
if id $User &>/dev/null;then
echo "用户${User}存在该系统!"
if ls -d /home/$User &>/dev/null;then
echo "用户也存在家目录!"
exit
else
echo "用户不存在家目录!"
exit
fi
elif ls -d /home/$User &>/dev/null;then
echo "用户不存在该系统!但是用户存在家目录!"
else
echo "用户不存在该系统!也不存在家目录!"
fi
[root@shell /service/scripts/day03]# sh if-2.sh
请输入你要查询的用户:test02
用户test02存在该系统!
用户不存在家目录!
[root@shell /service/scripts/day03]# sh if-2.sh
请输入你要查询的用户:test01
用户test01存在该系统!
用户也存在家目录!
[root@shell /service/scripts/day03]# sh if-2.sh
请输入你要查询的用户:test03
用户不存在该系统!但是用户存在家目录!
[root@shell /service/scripts/day03]# sh if-2.sh
请输入你要查询的用户:test04
用户不存在该系统!也不存在家目录!
[root@shell /service/scripts/day03]# cat if-3.sh
#!/bin/bash
String="Bigdata process is Hadoop, Hadoop is open source project"
echo $String
#定义菜单
cat<<EOF
#############################
1)打印string长度
2)删除字符串中所有的Hadoop
3)替换第一个Hadoop为Linux
4)替换全部Hadoop为Linux
#############################
EOF
#提示用户安装要求操作
read -p "请输入数字1|2|3|4,可以执行对应选项的功能:" Num
#判断用户输入的是否为数字
expr 1 + $Num &>/dev/null
if [ $? -ne 0 ];then
echo "你输入的不是一个数字!请重新输入!"
exit
fi
#根据数字进行判断
if [ $Num -eq 1 ];then
echo "变量String的长度为:${#String}"
exit
elif [ $Num -eq 2 ];then
echo "删除字符串中所有的Hadoop,结果如下:"
echo "${String//Hadoop/}"
exit
elif [ $Num -eq 3 ];then
echo "替换第一个Hadoop为Linux,结果如下:"
echo "${String/Hadoop/Linux}"
exit
elif [ $Num -eq 4 ];then
echo "替换全部Hadoop为Linux"
echo "${String//Hadoop/Linux}"
else
echo "你输入的数字不符合要求!请输入数字1|2|3|4"
fi
[root@shell /service/scripts/day03]# sh if-3.sh
Bigdata process is Hadoop, Hadoop is open source project
#############################
1)打印string长度
2)删除字符串中所有的Hadoop
3)替换第一个Hadoop为Linux
4)替换全部Hadoop为Linux
#############################
请输入数字1|2|3|4,可以执行对应选项的功能:1
变量String的长度为:56
[root@shell /service/scripts/day03]# sh if-3.sh
Bigdata process is Hadoop, Hadoop is open source project
#############################
1)打印string长度
2)删除字符串中所有的Hadoop
3)替换第一个Hadoop为Linux
4)替换全部Hadoop为Linux
#############################
请输入数字1|2|3|4,可以执行对应选项的功能:2
删除字符串中所有的Hadoop,结果如下:
Bigdata process is , is open source project
[root@shell /service/scripts/day03]# sh if-3.sh
Bigdata process is Hadoop, Hadoop is open source project
#############################
1)打印string长度
2)删除字符串中所有的Hadoop
3)替换第一个Hadoop为Linux
4)替换全部Hadoop为Linux
#############################
请输入数字1|2|3|4,可以执行对应选项的功能:3
替换第一个Hadoop为Linux,结果如下:
Bigdata process is Linux, Hadoop is open source project
[root@shell /service/scripts/day03]# sh if-3.sh
Bigdata process is Hadoop, Hadoop is open source project
#############################
1)打印string长度
2)删除字符串中所有的Hadoop
3)替换第一个Hadoop为Linux
4)替换全部Hadoop为Linux
#############################
请输入数字1|2|3|4,可以执行对应选项的功能:4
替换全部Hadoop为Linux
Bigdata process is Linux, Linux is open source project
[root@shell /service/scripts/day03]# sh if-3.sh
Bigdata process is Hadoop, Hadoop is open source project
#############################
1)打印string长度
2)删除字符串中所有的Hadoop
3)替换第一个Hadoop为Linux
4)替换全部Hadoop为Linux
#############################
请输入数字1|2|3|4,可以执行对应选项的功能:5
你输入的数字不符合要求!请输入数字1|2|3|4
[root@shell /service/scripts/day03]# sh if-3.sh
Bigdata process is Hadoop, Hadoop is open source project
#############################
1)打印string长度
2)删除字符串中所有的Hadoop
3)替换第一个Hadoop为Linux
4)替换全部Hadoop为Linux
#############################
请输入数字1|2|3|4,可以执行对应选项的功能:a
你输入的不是一个数字!请重新输入!
10. 流程控制语句文件比较
-e #如果文件或者目录存在则为真 [ -e file/dir ]
-s #如果文件存在且至少有一个字符则为真 [ -s file ] 用来判断空文件
-f #如果文件存在则为真
-d #如果目录存在则为真
-r #如果文件存在且有读的权限则为真 用于判断当前用户权限
-w #如果文件存在且有写的权限则为真
-x #如果文件存在且有执行的权限则为真
[root@shell /service/scripts/day03]# [ -e /root ] && echo "OK" || echo "ERROR"
OK
[root@shell /service/scripts/day03]# [ -e /roo ] && echo "OK" || echo "ERROR"
ERROR
[root@shell /service/scripts/day03]# [ -e /etc/hosts ] && echo "OK" || echo "ERROR"
OK
[root@shell /service/scripts/day03]# [ -e /etc/host ] && echo "OK" || echo "ERROR"
ERROR
[root@shell /service/scripts/day03]# [ -f /etc/host ] && echo "OK" || echo "ERROR"
ERROR
[root@shell /service/scripts/day03]# [ -f /etc/hosts ] && echo "OK" || echo "ERROR"
OK
[root@shell /service/scripts/day03]# [ -f /etc ] && echo "OK" || echo "ERROR"
ERROR
[root@shell /service/scripts/day03]# [ -d /etc ] && echo "OK" || echo "ERROR"
OK
[root@shell /service/scripts/day03]# [ -d /etc/hosts ] && echo "OK" || echo "ERROR"
ERROR
[root@shell /service/scripts/day03]# [ -s /etc/hosts ] && echo "OK" || echo "ERROR"
OK
[root@shell /service/scripts/day03]# touch test.log
[root@shell /service/scripts/day03]# [ -s test.log ] && echo "OK" || echo "ERROR"
ERROR
[root@shell /service/scripts/day03]# [ -s /etc ] && echo "OK" || echo "ERROR"
OK
[root@shell /service/scripts/day03]# mkdir test
[root@shell /service/scripts/day03]# [ -s test ] && echo "OK" || echo "ERROR"
OK
[root@shell /service/scripts/day03]# ll /etc/hosts
-rw-r--r--. 1 root root 158 2013-06-07 22:31 /etc/hosts
[root@shell /service/scripts/day03]# [ -r /etc/hosts ] && echo "OK" || echo "ERROR"
OK
[root@shell /service/scripts/day03]# [ -w /etc/hosts ] && echo "OK" || echo "ERROR"
OK
[root@shell /service/scripts/day03]# [ -x /etc/hosts ] && echo "OK" || echo "ERROR"
ERROR
[root@shell /service/scripts/day03]# cat if-4.sh
#!/bin/bash
if [ -f $1 ];then
echo "$1 文件存在"
else
echo "$1 文件不存在"
fi
[root@shell /service/scripts/day03]# sh if-4.sh /etc/hosts
/etc/hosts 文件存在
[root@shell /service/scripts/day03]# sh if-4.sh /etc/host
/etc/host 文件不存在
11. 数据库备份案例
[root@shell /service/scripts/day03]# yum install -y mariadb-server
1. 针对库进行备份 提示用户输入要备份的数据库
2. 判断数据库是否存在
3. 根据用户输入的数据库进行备份 mysqldump
4. 备份的名称 日期 2020-04-22_DBname.sql
5. 备份到哪里 /backup/mysql
6. 显示备份结果
[root@shell /service/scripts/day03]# systemctl start mariadb.service
[root@shell /service/scripts/day03]# systemctl enable mariadb.service
Created symlink from /etc/systemd/system/multi-user.target.wants/mariadb.service to /usr/lib/systemd/system/mariadb.service.
[root@shell /service/scripts/day03]# mysqladmin password "qls.123"
[root@shell /service/scripts/day03]# mysql -uroot -pqls.123 < world.sql
[root@shell /service/scripts/day03]# mysql -uroot -pqls.123 < wordpress.sql
[root@shell /service/scripts/day03]# mysqldump -uroot -pqls.123 -B world > test.sql
[root@shell /service/scripts/day03]# ll test.sql
-rw-r--r-- 1 root root 244162 2020-04-22 15:55 test.sql
[root@shell /service/scripts/day03]# cat if-5.sh
#!/bin/bash
#定义变量
Back_Dir=/backup/mysql
Date=$(date +%F)
M_User=root
M_Pass=qls.123
#判断备份目录是否存在
[ -d $Back_Dir ] || mkdir -p $Back_Dir
#提示用户输入要进行备份的数据库
read -p "请输入你要备份的数据库:" Db_Name
#判断数据库是否存在
mysql -u$M_User -p$M_Pass -e "use $Db_Name;" &>/dev/null
if [ $? -eq 0 ];then
echo "数据库${Db_Name}存在,正在备份数据库....."
else
echo "数据库${Db_Name}不存在!请检查你是否输入有误!"
exit
fi
#开始备份数据库
mysqldump -u$M_User -p$M_Pass --single-transaction -R -B $Db_Name > $Back_Dir/${Date}_${Db_Name}.sql
#判断数据库是否备份成功
if [ $? -eq 0 ];then
echo "数据库${Db_Name}备份成功...."
else
echo "数据库${Db_Name}备份失败...."
fi
[root@shell /service/scripts/day03]# sh if-5.sh
请输入你要备份的数据库:qls
数据库qls不存在!请检查你是否输入有误!
[root@shell /service/scripts/day03]# sh if-5.sh
请输入你要备份的数据库:123
数据库123不存在!请检查你是否输入有误!
[root@shell /service/scripts/day03]# sh if-5.sh
请输入你要备份的数据库:world
数据库world存在,正在备份数据库.....
数据库world备份成功....
[root@shell /service/scripts/day03]# sh if-5.sh
请输入你要备份的数据库:wordpress
数据库wordpress存在,正在备份数据库.....
数据库wordpress备份成功....
[root@shell /service/scripts/day03]# ll /backup/mysql/
total 692
-rw-r--r-- 1 root root 462582 2020-04-22 16:12 2020-04-22_wordpress.sql
-rw-r--r-- 1 root root 244210 2020-04-22 16:12 2020-04-22_world.sql
[root@shell /service/scripts/day03]# cat if-5.sh
#!/bin/bash
#定义变量
Back_Dir=/backup/mysql
Date=$(date +%F)
#M_User=root
#M_Pass=qls.123
#判断备份目录是否存在
[ -d $Back_Dir ] || mkdir -p $Back_Dir
#提示用户输入备份数据库的用户
read -p "请输入你要备份数据库的用户:" M_User
#提示用户输入备份数据库的用户的密码
read -s -p "请输入你要备份数据库的用户的密码:" M_Pass
echo
#提示用户输入要进行备份的数据库
read -p "请输入你要备份的数据库:" Db_Name
#判断数据库是否存在
mysql -u$M_User -p$M_Pass -e "use $Db_Name;" &>/dev/null
if [ $? -eq 0 ];then
echo "数据库${Db_Name}存在,正在备份数据库....."
else
echo "数据库${Db_Name}不存在!请检查你是否输入有误!"
exit
fi
#开始备份数据库
mysqldump -u$M_User -p$M_Pass --single-transaction -R -B $Db_Name > $Back_Dir/${Date}_${Db_Name}.sql
#判断数据库是否备份成功
if [ $? -eq 0 ];then
echo "数据库${Db_Name}备份成功...."
else
echo "数据库${Db_Name}备份失败...."
fi
[root@shell /service/scripts/day03]# sh if-5.sh
请输入你要备份数据库的用户:root
请输入你要备份数据库的用户的密码:
请输入你要备份的数据库:test
数据库test存在,正在备份数据库.....
数据库test备份成功....
[root@shell /service/scripts/day03]# ll /backup/mysql/
total 696
-rw-r--r-- 1 root root 1447 2020-04-22 16:19 2020-04-22_test.sql
-rw-r--r-- 1 root root 462582 2020-04-22 16:12 2020-04-22_wordpress.sql
-rw-r--r-- 1 root root 244210 2020-04-22 16:12 2020-04-22_world.sql