零基础Linux操作基础小白快速掌握Shell脚本语言的运算

1.1算数运算

shell支持算术运算,但只支持整数,不支持小数

1.2 Bash中的算术运算

-- + 加法运算
-- - 减法运算
-- * 乘法运算
-- / 除法运算
-- % 取模,即取余数
-- ** 乘方 

#乘法符号在有些场景需要转义

1.3 实现算术运算

1. let var=算术表达式
2. var=$[算术表达式]
3. var=$((算术表达式))
4. var=$(expr arg1 arg2 arg3 ...)
5. declare -i var = 数值
6. echo '算术表达式' | bc  (支持浮点数)

实例:使用bc计算小数和declare -i计算

[root@localhost ~]# echo "scale=3;20/3"|bc
6.666
[root@localhost ~]# echo "scale=3;2/3"|bc
.666
[root@localhost ~]# i=20
[root@localhost ~]# j=20
[root@localhost ~]# declare -i sum=i*j
[root@localhost ~]# echo $sum
400
[root@localhost ~]# 

内建的随机数生成器变量:

$RANDOM  取值范围:0-32767

实例:生成0-49之间的随机数
[root@localhost ~]# echo $[$[$RANDOM%50]+1]
40
[root@localhost ~]# echo $[$RANDOM%50]
44
[root@localhost ~]# echo $[$[$RANDOM%50]+1]  #生成1~50之间的随机数
[root@localhost ~]# echo $[RANDOM % 100 + 1]
实例:生成随机颜色字符串
[root@localhost ~]# echo -e "\033[1;$[RANDOM%7+31]mStudy\033[0m"
Study
[root@localhost ~]# echo -e "\033[1;$[RANDOM%7+31]mStudy\033[0m"
Study
[root@localhost ~]#

1.3 增强型赋值:

+= 
i+=10 <==> i=1+10
-=
i-=j  <==> i=i-j
*=
/=
%=
++ 
i++,++i <==> i=i+1 (自增)
--
i--,--i <==> i=i-1 (自减)

格式:

let varOPERvalue

实例:自增,自减
[root@localhost ~]# let var+=1
[root@localhost ~]# echo $var
1
[root@localhost ~]# let var++
[root@localhost ~]# echo $var
2
[root@localhost ~]# let var-=1
[root@localhost ~]# echo $var
1
[root@localhost ~]# let var--
[root@localhost ~]# echo $var
0
[root@localhost ~]#

[root@localhost ~]# unset i j ;i=1;let j=i++;echo "i=$i,j=$j" 
i=2,j=1
[root@localhost ~]# unset i j ;i=1;let j=++i;echo "i=$i,j=$j"
i=2,j=2
[root@localhost ~]# 

# i++ 与 ++i的区别:
i++ 先赋值再运算
++i 先运算再赋值
实例:鸡兔同笼问题
[root@localhost ~]# vim shell/chicken.sh
#!/bin/bash
HEAD=35
FOOT=94

RABBIT=$(((FOOT-HEAD-HEAD)/2))
CHOOK=$[35-RABBIT]
echo "兔子的数量为:"$RABBIT
echo "鸡的数量为: "$CHOOK
                           
[root@localhost ~]# chmod +x shell/chicken.sh 
[root@localhost ~]# shell/chicken.sh 
兔子的数量为::12
鸡的数量为:23
[root@localhost ~]# 

# 在脚本中写入变量,让用户在命令行写入需要计算的数值
[root@localhost ~]# vim shell/chicken.sh
#!/bin/bash
HEAD=$1
FOOT=$2

RABBIT=$(((FOOT-HEAD-HEAD)/2))
CHOOK=$[35-RABBIT]
echo "兔子的数量为:"$RABBIT
echo "鸡的数量为: "$CHOOK
          
[root@ansible-salve1 ~]# ./chicken.sh 30 80
兔子的数量为:10
鸡的数量为: 25
[root@ansible-salve1 ~]# 
面试题:计算出所有人的年龄总和11
[root@ansible-salve1 shell]# vim nianling.txt
[root@ansible-salve1 shell]# cat nianling.txt
a=20
b=18
c=22
[root@ansible-salve1 shell]# cut -d"=" -f2 nianling.txt 
20
18
22
[root@ansible-salve1 shell]# cut -d"=" -f2 nianling.txt | tr '\n' + | grep -Eo ".*[0-9]" | bc
60
[root@ansible-salve1 shell]# grep -Eo "[0-9]+" nianling.txt 
20
18
22
[root@ansible-salve1 shell]# grep -Eo "[0-9]+" nianling.txt | tr '\n' +| grep -Eo ".*[0-9]" | bc
60
[root@ansible-salve1 shell]# 

1.5逻辑运算(了解,不用掌握)

True用数字表示1,False用数字表示0

  • 与:&
1 与 1 = 1   
1 与 0 = 0
0 与 1 = 0
0 与 0 = 0
  • 或:|
1 或 1 = 1
1 或 0 = 1
0 或 1 = 1
0 或 0 = 0
  • 非:!
!1 = 0  !True=False
!0 = 1  !False=True
  • 异或:^
#异或的两个值,相同为假,不同为真
1 ^ 1 =0
1 ^ 0 =1
0 ^ 1 =1
0 ^ 0 =0
1.6短路运算(不用了解)
  • 短路与
CMD1 短路与 CMD2
--第一个CMD1结果为0(假),总的结果必定为0,所以不需要执行CMD2
--第二个CMD1结果为1(真),第二个CMD2必须要参与计算,才能得到最终的结果
  • 短路或
CMD1 短路或 CMD2
--第一个CMD1结果为1(真),总的结果必定为1,因此不需要执行CMD2
--第一个CMD1结果为0(假),第二个CMD2必须要参与运算,才能得到最终的结果

1.7 条件测试命令

条件测试:判断某需求是否满足,需要由测试机制来实现,专用的测试表达式需要由测试命令辅助完成测试过程,实现评估布尔声明,以便在条件性环境下进行执行。
  • 若真,则状态码变量$?返回0

  • 若假,则状态码变量$?返回1

扩展: [ ] 与 [[ ]] 的区别

`区别1:
[ ]是符合POSIX标准的测试语句,兼容性强,几乎可以运行在所有的Shell解释器中
[[ ]]仅可运行在特定的几个Shell解释器中(如Bash)

`区别2:
> < 可以在[[ ]]中使用ASCII码顺序进行排序,而[]不支持

`区别3:
在[ ]中使用-a 和 -o 表示逻辑与和逻辑或,[[ ]]使用&& 和 || 表示,[[ ]]不支持-a

`区别4:
在[ ]中==是字符匹配,在[[ ]]中==是模式匹配

`区别5:
[ ]不支持正则匹配,[[ ]]支持用=~进行正则匹配

`区别6:
[ ]仅在部分Shell中支持用()进行分组,[[ ]]均支持

`区别7:
在[ ]中如果变量没有定义,那么需要用双引号引起来,在[[ ]]中不需要
1.1.1 条件测试命令及其语法

语法1:test <测试表达式> 说明:test命令和<测试表达式>之间至少有一个空格

# 在shell中,大于用 -gt 表示,小于用 -lt 表示,大于或等于用 -ge 表示,小于或等于用 -le表示 ,不相等用-ne 表示
[root@ansible-salve1 ~]# test 1 -lt 2
[root@ansible-salve1 ~]# echo $?
0
[root@ansible-salve1 ~]# test 2 -lt 1
[root@ansible-salve1 ~]# echo $?
1
[root@ansible-salve1 ~]# 

语法2:[<测试表达式>] 说明:该方法和test命令的用法一样,[]的两边和内容之间至少有一个空格

[root@ansible-salve1 ~]# [ 1 -gt 3 ]
[root@ansible-salve1 ~]# echo $?
1
[root@ansible-salve1 ~]# [ 1 -lt 3 ]
[root@ansible-salve1 ~]# echo $?
0
[root@ansible-salve1 ~]# 

语法3:[[ <测试表达式> ]] 说明:比test和[]更新的语法格式。[[]]的边界和内容之间至少有一个空格。[[]]中可以使用通配符等进行模式匹配

[root@ansible-salve1 ~]# [[ 1 > 3 ]]
[root@ansible-salve1 ~]# echo $?
1
[root@ansible-salve1 ~]# [[ 1 < 3 ]]
[root@ansible-salve1 ~]# echo $?
0
[root@ansible-salve1 ~]# 

语法4:((<测试表达式>)) 说明:一般用于if语句里,双小括号两端不需要有空格,测试对象只能是整数

[root@ansible-salve1 ~]# ((1>2))
[root@ansible-salve1 ~]# echo $?
1
[root@ansible-salve1 ~]# ((1<2))
[root@ansible-salve1 ~]# echo $?
0
[root@ansible-salve1 ~]#
1.1.2 变量测试
语法规则:-v VAR 变量var是否被定义

示例:判断NAME变量是否被定义

[root@ansible-salve1 shell]# [[ -v NAME ]]
[root@ansible-salve1 shell]# echo $?
1
[root@ansible-salve1 shell]# NAME=1
[root@ansible-salve1 shell]# [[ -v NAME ]]
[root@ansible-salve1 shell]# echo $?
0
[root@ansible-salve1 shell]#

语法规则: -R VAR 变量VAR是否被引用

示例:判断NAME变量是否被引用

[root@ansible-salve1 shell]# NAME=10
[root@ansible-salve1 shell]# test -v NAME
[root@ansible-salve1 shell]# echo $?
0
[root@ansible-salve1 shell]# test -R NAME
[root@ansible-salve1 shell]# echo $?
1
[root@ansible-salve1 shell]# 
1.1.3 文件测试表达式

常用的文件测试操作符                          说明                               
  -a/-e 文件                                       文件是否存在                           
  -b 文件                         文件是否存在,且为块文件,如果文件存在且是一个块文件,则结果为0 
  -c 文件                        文件是否存在且为字符文件,如果文件存在且是一个字符文件,则结果为0
  -L 文件 或 -h 文件             文件存在且为链接文件则为真                    
  -d 文件                           文件存在且为目录则为真,即测试表达式成立             
  -f 文件                            文件存在且为普通文件则为真,即测试表达式成立           
  -s 文件                           文件存在且文件大小不为0则为真                  
  -S 文件                           文件是否存在且为套接字文件                    
  -p 文件                             文件是否存在且为管道文件                     
  -u 文件                            文件是否存在且拥有suid的权限,如果设置了suid,则结果为0 
  -g 文件                             文件是否存在且拥有sgid的权限                 
  -r 文件                             文件存在且可读为真                        
  -w 文件                             文件存在且可写为真                        
  -x 文件                                文件存在且可执行则为真                      
  -t fd                                   fd 文件描述符是否在某终端已经被打开              
  -N 文件                            文件自从上一次读取之后是否被修改过                
  -O 文件                             当前有效用户是否为文件属主                    
  -G 文件                              当前有效用户是否为文件属组                    
  f1 -ef f2                                 文件f1是否是文件f2的硬链接                  
  f1 -nt f2,nt为newerthan         文件f1比文件f2新则为真,根据文件的修改时间来计算       
  f1 -ot f2,ot为olderthan          文件f1比文件f2旧则为真,根据文件的修改时间来计算       

测试文件
[root@ansible-salve1 ~]# test -a test.txt
[root@ansible-salve1 ~]# echo $?
1
[root@ansible-salve1 ~]# test -d shell
[root@ansible-salve1 ~]# echo $?
0
[root@ansible-salve1 ~]# touch test.txt
[root@ansible-salve1 ~]# test -w test.txt &&echo  "true"
true
[root@ansible-salve1 ~]# test -r test.txt &&echo  "true"
true
[root@ansible-salve1 ~]# test -x test.txt &&echo  "true"
[root@ansible-salve1 ~]# 
1.1.4 字符串测试表达式

  常用字符串测试操作符                             说明                   
  -n ”字符串“         若字符串的长度不为0,则为真,即测试表达式成立,n可以理解为nozero  
  -z ”字符串“                     若字符串的长度为0,则为真,z可以理解为zero        
  >                                  Ascii码是否大于Ascii码 [[ ]]         
  “字符串1” == ”字符串2“               若字符串1长度等于字符串2长度,则为真           
  “字符串1” != ”字符串2“               若字符串1长度不等于字符串2长度,则为真          
  “字符串1” =~ “字符串2”       左侧字符串是否能被右侧的PATTERN所匹配。注意:此表达式                                               用于[[ ]]中:扩展的正则表达式
 

测试字符串
[root@ansible-salve1 ~]# var_test='Mike' 
[root@ansible-salve1 ~]# echo $var_test 
Mike
[root@ansible-salve1 ~]# [[ -n var_test ]] && echo "True"
True

# 通配符
[root@ansible-salve1 ~]# FILE=test.log
[root@ansible-salve1 ~]# [[ "$FILE" == *.log ]] && echo "True"
True
[root@ansible-salve1 ~]# FILE=test.txt
[root@ansible-salve1 ~]# [[ "$FILE" == *.log ]] && echo "True"
[root@ansible-salve1 ~]# [[ "$FILE" != *.log ]] && echo "True"
True
[root@ansible-salve1 ~]# 

# 扩展的正则表达式
[root@ansible-salve1 ~]# FILE=test.log
[root@ansible-salve1 ~]# [[ "$FILE" =~  \.log$ ]] && echo "True"
True
[root@ansible-salve1 ~]# N=100
[root@ansible-salve1 ~]# [[ "$N" =~ ^[0-9]+$ ]] && echo "True"
True
[root@ansible-salve1 ~]# N=A10
[root@ansible-salve1 ~]# [[ "$N" =~ ^[0-9]+$ ]] && echo "True"
[root@ansible-salve1 ~]# IP=1.2.3.4
[root@ansible-salve1 ~]# [[ "$IP" =~ ^([0-9]{1,3}\.){3}[0-9]{1,3}$ ]]
[root@ansible-salve1 ~]# echo $?
0
[root@ansible-salve1 ~]# 
# 使用正则表达式判断IP是否合法
[root@ansible-salve1 ~]# IP=1.2.3.333
[root@ansible-salve1 ~]# [[ $IP =~ ^(([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$ ]]
[root@ansible-salve1 ~]# echo $?
1
[root@ansible-salve1 ~]# IP=255.255.255.255
[root@ansible-salve1 ~]# [[ $IP =~ ^(([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$ ]]
[root@ansible-salve1 ~]# echo $?
0
[root@ansible-salve1 ~]# 
1.1.5 整数测试表达式
在[ ] 或 test中使用的比较符号
在(()) 或 [[ ]]中使用的比较符号(不用这个做数字比较)
          说明
-eq\== 或 =相等,equal
-ne!=不相等,not equal
-gt>大于,greater than
-ge> =大于等于,greater equal
-lt<小于,less than
-le< =小于等于,less equal
1.1.6 逻辑操作符
在[ ] 中使用的操作符在test, [[ ]] , (( ))中使用的逻辑操作符说明
-a&&and,与,两边都为真,则结果为真
-o||or,或,有真则真,同假则假
not,非,两端相反,则结果相反

示例:

[root@ansible-salve1 ~]# var_test=1
[root@ansible-salve1 ~]# var_t=2
[root@ansible-salve1 ~]# [ $var_test -lt 0 -a $var_t -gt 0 ]
[root@ansible-salve1 ~]# echo $?
1
[root@ansible-salve1 ~]# [ $var_test -lt 0 -o $var_t -gt 0 ]
[root@ansible-salve1 ~]# echo $?
0
[root@ansible-salve1 ~]# 

1.8  关于()与 { }

( )和 { }都可以将多个命令组合再一次,批量执行,{ } 里的内容需要与两侧用空格隔开并在命令结尾加上;

  • ( )会开启子shell,并且list中变量赋值及内部命令执行后,将不再影响后续的环境

  • [root@ansible-salve1 ~]# name=mage;(echo $name;name=wang;echo $name);echo $name
    mage
    wang
    mage
    
    [root@ansible-salve1 ~]# (umask 444;umask);umask
    0444
    0022
    [root@ansible-salve1 ~]# (umask 444;touch 1.txt);umask
    0022
    [root@ansible-salve1 ~]# ll 1.txt 
    --w--w--w- 1 root root 0 11月 13 22:12 1.txt
    [root@ansible-salve1 ~]# echo $BASHPID
    1418
    [root@ansible-salve1 ~]# (echo $BASHPID; sleep 3)
    1501
  •  { } 不会开启子shell,在当前shell中运行,会影响当前shell环境
 [root@ansible-salve1 ~]# name=mage;{ echo $name;name=wang;echo $name; };echo $name
mage
wang
wang
[root@ansible-salve1 ~]# { umask 444;touch 1.txt; };umask
0444
[root@ansible-salve1 ~]# umask
0444
[root@ansible-salve1 ~]# ll 1.txt 
--w--w--w- 1 root root 0 11月 13 22:23 1.txt
[root@ansible-salve1 ~]# echo $BASHPID
1418
[root@ansible-salve1 ~]# { echo $BASHPID; sleep 3; }
1418
[root@ansible-salve1 ~]#  

1.9 组合测试条件

1.9.1 第一种方式[ ]
[ EXPRESSION1  -a EXPRESSION2]  并且 ==> 条件1与条件2都为真,结果才为真
[ EXPRESSION1  -O EXPRESSION2]  或  ==> 条件1与条件2只要有一个为真,结果就为真
[ !EXPRESSION1 ]  取反

说明:-a 和 -o 需要使用测试命令执行,[[ ]] 不支持

示例:

[root@ansible-salve1 ~]# ll 1.txt 
--w--w--w- 1 root root 0 11月 13 22:23 1.txt
[root@ansible-salve1 ~]# FILE=/root/1.txt 
[root@ansible-salve1 ~]# [ -f $FILE -a -x $FILE ]
[root@ansible-salve1 ~]# echo $?
1
[root@ansible-salve1 ~]# chmod +x /root/1.txt 
[root@ansible-salve1 ~]# [ -f $FILE -a -x $FILE ]
[root@ansible-salve1 ~]# echo $?
0
[root@ansible-salve1 ~]# 
1.9.2 第二种方式[[ ]]
COMMAND1 && COMMAND2 #并且,短路与,代表条件性的AND THEN
如果COMMAND1 成功,将执行COMMAND2,否则,将不执行COMMAND2

COMMAND1 || COMMAND2 #或者,短路或,代表条件性的OR ELSE
如果COMMAND1 成功,将不执行COMMAND2,否则,将执行COMMAND2

! COMMAND #非,取反


# 结论:如果&& 和 || 混合使用,&&要在前,||放在后

示例:

[root@ansible-salve1 ~]# id hehao &> /dev/null  || useradd hehao  # 前面执行不成功,则执行后面的语句
[root@ansible-salve1 ~]# id hehao &> /dev/null  && echo "此账户已存在"
此账户已存在
[root@ansible-salve1 ~]# 

[root@ansible-salve1 ~]# IP=10.0.0.11;ping -c1 -w1 $IP &> /dev/null && echo $IP is up || echo $IP is down
10.0.0.11 is down
[root@ansible-salve1 ~]# IP=192.168.80.1;ping -c1 -w1 $IP &> /dev/null && echo $IP is up || echo $IP is down
192.168.80.1 is up
[root@ansible-salve1 ~]# 

示例:磁盘空间的判断

# 查看磁盘空间占用率
[root@ansible-salve1 shell]# df | grep '^/dev/nv'  | grep -oE '[0-9]+%' | tr -d %
17
[root@ansible-salve1 shell]# cat fd.sh 
#!/bin/bash
WARNING=10
SPACE_USED=`df | grep '^/dev/nv'  | grep -oE '[0-9]+%' | tr -d %`
["$SPACE_USED" -gt $WARNING] && echo "磁盘空间不足,请尽快处理" |  mail -s "DISK Warning" 1446528135@qq.com

2.0 使用read命令命令来接受输入

read 是 Shell 内置命令,用来从标准输入中读取数据并赋值给变量。如果没有进行重定向,默认就是从键盘读取用户输入的数据;如果进行了重定向,那么可以从文件中读取数据

2.0.1 语法结构
read [option] [variables]

--options表示选项

--variables表示用来存储数据的变量,可以有一个,也可以有多个。

-- options和variables都是可选的,如果没有提供变量名,那么读取的数据将存放到环境变量 REPLY 中。

2.0.2 选项:

Option说明
-a array把读取的数据赋值给数组array,从下标0开始
-d delimiter把字符串delimiter指定读取结束的位置,而不是一个换行符(读取的数据不包括delimiter)
-e在获取用户输入的时候,对功能键进行编码转换,不会直接显示功能键对应的字符
-n num读取num个字符,而不是整行字符
-p prompt显示提示信息,提示内容为prompt
-r原样读取(Raw mode),不会把反斜杠字符解释为转义字符
-s静默模式(Silent mode),不会再屏幕上显示输入的字符。例如:输入密码
-t seconds设置超时时间,单位为秒。如果用户没能按时完成,返回一个非0的退出状态
-u fd使用文件描述符fd作为输入源,而不是标准输入,类似于重定向
示例:使用read给多个变量赋值并输出
[root@ansible-salve1 shell]# vim info.sh 
#!/bin/bash
read -p "Enter some information > " name url age
echo "网站名字:$name"
echo "网址:$url"
echo "年龄:$age"
[root@ansible-salve1 shell]# chmod +x info.sh 
[root@ansible-salve1 shell]# ./info.sh 
Enter some information > hehao www.baidu.com 18
网站名字:hehao
网址:www.baidu.com
年龄:18
[root@ansible-salve1 shell]# 

# 注意:必须在一行内输入所有的值,不能换行,否则只能给第一个变量赋值,后续变量都会赋值失败

示例:只读取一个字符
# -n 1表示只读取一个字符,运行脚本后,只要用户输入一个字符,立即就读取结束,不等待用户按下回车键
[root@ansible-salve1 shell]# vim info1.sh 
#!/bin/bash
read -n 1 -p "Enter a char > " char  && printf "\n"
echo "---------------------------------------------------------"
echo $char
[root@ansible-salve1 shell]# chmod +x info1.sh 
[root@ansible-salve1 shell]# ./info1.sh 
Enter a char > a
---------------------------------------------------------
a

示例:在指定时间内输入密码

#使用&&组合了多个命令,这些命令会依次执行,并且从整体上作为 if 语句的判断条件,只要其中一个命令执行失败(退出状态为非 0 值),整个判断条件就失败了,后续的命令也就没有必要执行
[root@ansible-salve1 shell]# vim info2.sh
#!/bin/bash
if
    read -t 20 -sp "Enter password in 20 seconds(once) > " pass1 && printf "\n" &&  #第一次输入密码
    read -t 20 -sp "Enter password in 20 seconds(again)> " pass2 && printf "\n" &&  #第二次输入密码
    [ $pass1 == $pass2 ]  #判断两次输入的密码是否相等
then
    echo "Valid password"
else
    echo "Invalid password"
fi
[root@ansible-salve1 shell]# chmod +x info2.sh 
[root@ansible-salve1 shell]# ./info2.sh 
Enter password in 20 seconds(once) > 
Enter password in 20 seconds(again)> 
Valid password
[root@ansible-salve1 shell]# 
示例:利用正则表达式
[root@ansible-salve1 shell]# vim info3.sh
[root@ansible-salve1 shell]# cat info3.sh 
#!/bin/bash
read -p "Are you rich? yes or no: " ANSWER
[[ $ANSWER =~ ^[Yy]|[Yy][Ee][Ss]$ ]] && echo "You Are Rich" || echo "Good Good Study,Day Day up"
[root@ansible-salve1 shell]# chmod +x info3.sh 
[root@ansible-salve1 shell]# ./info3.sh 
Are you rich? yes or no: y
You Are Rich
[root@ansible-salve1 shell]# ./info3.sh 
Are you rich? yes or no: YeS
You Are Rich
[root@ansible-salve1 shell]# 

示例:工作选项

[root@ansible-salve1 shell]# vim backup.sh #!/bin/bashSRC=/etc/DEST=/data/backup_`date +%F_%H-%M-%S`cp -a $SRC $DEST[ $? -eq 0 ] && echo "备份成功" || echo "备份失败"[root@ansible-salve1 shell]# chmod +x backup.sh[root@ansible-salve1 shell]# vim info4.sh#!/bin/bashcat <<EOF请选择:1.备份文件2.清理日志文件3.软件升级4.软件回滚5.删库跑路EOFread -p "请输入上面的数字1-5:" MENU[ $MENU -eq 1 ] && ./backup.sh[ $MENU -eq 2 ] && echo "清理日志文件"[ $MENU -eq 3 ] && echo "软件升级"[ $MENU -eq 4 ] && echo "软件回滚"[ $MENU -eq 5 ] && echo "删除跑路"[root@ansible-salve1 shell]# chmod +x info4.sh [root@ansible-salve1 shell]# ./info4.sh 请选择:1.备份数据库2.清理日志文件3.软件升级4.软件回滚5.删库跑路请输入上面的数字1-5:1备份成功[root@ansible-salve1 shell]# 

1111111111

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值