shell脚本知识点3

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

		
posted @   zbzSH  阅读(100)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示