shell-基础2

条件表达式

文件判断

文件测试操作符

常用文件测试操作符 说明
-d文件,d的全拼为directory 文件存在且为目录则为真,即测试表达式成立
-f文件,f的全拼为file 文件存在且为普通文件则为真,即测试表达式成立
-e文件,e的全拼为exist 文件存在则为真,即测试表达式成立。注意区别于“-f”,-e不辨别是目录还是文件
-r文件,r的全拼为read 文件存在且可读则为真,即测试表达式成立
-s文件,s的全拼为size 文件存在且文件大小不为0则为真,即测试表达式成立
-w文件,w的全拼为write 文件存在且可写则为真,即测试表达式成立
-x文件,x的全拼为executable  文件存在且可执行则为真,即测试表达式成立
-L文件,L的全拼为link 文件存在且为链接文件则为真,即测试表达式成立
fl -nt f2nt 的全拼为 newer than 文件fl比文件f2新则为真,即测试表达式成立。根据文件的修改时间来计算
fl -ot f2ot 的全拼为 older than 文件fl比文件f2旧则为真,即测试表达式成立。根据文件的修改时间来计算

判断文件是否存在

[root@client script]# [ -f /etc/hosts ]
[root@client script]# echo $?
0

[root@client script]# [ -f /etc/hosts1 ]
[root@client script]# echo $?
1

判断文件是否存在,返回方式

[root@client ~]# [ -f /etc/hosts ] && echo "文件存在" || echo "文件不存在"
文件存在

[root@client ~]# [ -f /etc/hosts1 ] && echo "文件存在" || echo "文件不存在"
文件不存在

判断目录是否存在

[root@client ~]# [ -d /tmp ] && echo "目录存在" || echo "目录不存在"
目录存在
[root@client ~]# [ -d /tmp1 ] && echo "目录存在" || echo "目录不存在"
目录不存在

使用变量的方法进行判断

[root@client ~]# dir=/etc1/;[ -d $dir ] && tar zcf etc.tar.gz $dir || echo "$dir目录不存在"
/etc1/目录不存在

字符串判断

字符串测试操作符 

常用字符串测试操作符 说明
-n "字符串" 若字符串的长度不为0,则为真,即测试表达式成立,n可以理解为no zero
-Z "字符串" 若字符串的长度为0,则为真,即测试表达式成立,z可以理解为zero的缩写
" 1"== " 2" 若字符串1等于字符串2,则为真,即测试表达式成立,可使用"=="代替"="
" 1" = " 2" 若字符串1不等于字符串2,则为真,即测试表达式成立,但不能用"!=="代替"!="

1.对于字符串的测试,一定要将字符串加双引号之后再进行比较。

2.空格非空

-z 判断字符串长度

[root@client ~]# x= ; [ -z "$x" ] && echo "输入为空" || echo '输入有内容'
输入为空

[root@client ~]# x=1 ; [ -z "$x" ] && echo "输入为空" || echo '输入有内容'
输入有内容

-n 判断字符串长度

[root@client ~]# x=12 ; [ -n "$x" ] && echo "输入有内容" || echo '输入为空'
输入有内容
[root@client ~]# x= ; [ -n "$x" ] && echo "输入有内容" || echo '输入为空'
输入为空

"串 1" == " 串 2 "       使用定义变量的方式进行判断

[root@client ~]# cmd=start;[ "$cmd" == "start" ] && echo start
start

整数判断

整数二元比较操作符参考

[]以及test (())[[]] 说明
使用的比较符号 使用的比较符号
-eq ==或= 相等,全拼为equal
-ne = 不相等,全拼为not equal
-gt > 大于,全拼为greater than
-ge >= 大于等于,全拼为greater equal
-lt < 小于,全拼为丨ess than
-le <= 小于等于,全拼为less equal

判断两数是否相等

[root@client ~]# [ 1 -eq 1 ]
[root@client ~]# echo $?
0

[root@client ~]# [ 1 -eq 2 ]
[root@client ~]# echo $?
1

大于等于

[root@client ~]# [ 11 -ge 1 ] && echo "成立" || echo "不成立"
成立

小于

[root@client ~]# [ 11 -lt 1 ] && echo "成立" || echo "不成立"
不成立

大于

[root@client ~]# [ 11 -gt 1 ] && echo "成立" || echo "不成立"
成立

不等于

[root@client ~]# [ 11 -ne 1 ] && echo "成立" || echo "不成立"
成立

逻辑符号

[]test中使用的操作符 说明 [[]]和中使用的操作符 说明
-a

[ 条件A -a  条件B ]

A与B都要成立,整个表达式才成立

&& and,与,两端都为真,则结果为真
-o

[ 条件A -o  条件B]

A与B都不成立,整个表达式才不成立

||

or,或,两端有一个为真,则结果为真
!   ! not,非,两端相反,则结果为真

逻辑操作符与整数判断配合

[root@client ~]# [ 11 -ne 1 ] && echo "成立" || echo "不成立"
成立

取反

[root@client ~]# [ ! 11 -ne 1 ] && echo "成立" || echo "不成立"
不成立

两边都为真

[root@client ~]# [ 11 -ne 1 -a 1 -eq 1 ] && echo "成立" || echo "不成立"
成立

至少有一边为真

[root@client ~]# [ 11 -ne 1 -o 1 -eq 1 ] && echo "成立" || echo "不成立"
成立

感叹号的特殊用法

使用历史命令,感叹号加上history中的序号,即可执行

[root@client ~]# !38
echo $?
0

【练习题】开发3个shell脚本比较2个整数大小

要求:

1. 分别以定义变量,脚本传参以及read读入的方式写3个脚本。

2. 用条件表达式(禁止if语句)进行判断。

3. 将2个整数的比较结果输出到屏幕,出错需要提示。

 使用定义变量方法

 

#!/bin/bash
#############################################################
# File Name: panduan1.sh
# Version: V1.0
# Author: clsn
# Organization: http://blog.znix.top
# Created Time : 2017-12-06 11:27:32
# Description:
#############################################################

NUM1=6
NUM2=2

expr 1 + $NUM1  &>/dev/null
[ $? -eq 2 ] && echo "$NUM1 不是整数 " &&  exit 2
expr 1 + $NUM2 &>/dev/null
[ $? -eq 2 ] && echo "$NUM2 不是整数 " &&  exit 2

[ "$NUM1" -eq "$NUM2" ] && echo $NUM1 = $NUM2  && exit
[ "$NUM1" -gt "$NUM2" ] && echo $NUM1 \> $NUM2 && exit
[ "$NUM1" -lt "$NUM2" ] && echo $NUM1 \< $NUM2

[root@client script]# bash panduan2.sh
6 > 2

 使用传参数的方法

[root@client script]# vi panduan1.sh
#!/bin/bash
#############################################################
# File Name: panduan1.sh
# Version: V1.0
# Author: clsn
# Organization: http://blog.znix.top
# Created Time : 2017-12-06 11:27:32
# Description:
#############################################################
[ $# -ne 2 ] && echo "UASGE $0 num1 num2 " && exit

NUM1=$1
NUM2=$2

expr 1 + $NUM1 &>/dev/null
[ $? -eq 2 ] && echo "$NUM1 不是整数 " && exit 2
expr 1 + $NUM2 &>/dev/null
[ $? -eq 2 ] && echo "$NUM2 不是整数 " && exit 2

[ "$NUM1" -eq "$NUM2" ] && echo $NUM1 = $NUM2 && exit
[ "$NUM1" -gt "$NUM2" ] && echo $NUM1 \> $NUM2 && exit
[ "$NUM1" -lt "$NUM2" ] && echo $NUM1 \< $NUM2

 

[root@client script]# bash panduan1.sh 2 3
2 < 3

 使用read读入

 

[root@client script]# vi panduan_read.sh
#!/bin/bash
#############################################################
# File Name: panduan1.sh
# Version: V1.0
# Author: clsn
# Organization: http://blog.znix.top
# Created Time : 2017-12-06 11:27:32
# Description:
#############################################################

read -p "请输入第一个整数:" NUM1
read -p "请输入第二个整数:" NUM2

expr 1 + $NUM1 &>/dev/null
[ $? -eq 2 ] && echo "$NUM1 不是整数 " && exit 2
expr 1 + $NUM2 &>/dev/null
[ $? -eq 2 ] && echo "$NUM2 不是整数 " && exit 2

[ "$NUM1" -eq "$NUM2" ] && echo "$NUM1 = $NUM2" && exit
[ "$NUM1" -gt "$NUM2" ] && echo "$NUM1 > $NUM2" && exit
echo "$NUM1 < $NUM2"

[root@client script]# bash panduan_read.sh
请输入第一个整数:2
请输入第二个整数:4
2 < 4

if条件语句

 # 条件表达式和if语句可以互相转换

 

单分支语句

if [ -f /etc/hosts ]

then

    echo '文件存在'

fi

双分支语句

复制代码
if [ -f /etc/hosts ]  

then

   echo "文件存在"

else

echo "文件不存在"

   echo "..." >>/tmp/test.log

fi
复制代码

多分支语句

复制代码
if [ -f /etc/hosts ]  

then

   echo " hosts文件存在"

elif [ -f /etc/host ]

then

   echo " host文件存在"

fi
复制代码

if条件语句小结

  单分支:一个条件一个结果

  双分支:一个条件两个结果

  多分支:多个条件多个结果

 

【练习题1】输入2个数字,比较大小(使用if语句结合条件表达式实现) 

说明:

3个脚本:使用直接赋值,传参,read任一种方法写3种脚本(单分支,双分支,多分支)

示例脚本一:

 

[root@client script]# vi panduan5.sh
#!/bin/bash
#############################################################
# File Name: panduan1.sh
# Version: V1.0
# Author: clsn
# Organization: http://blog.znix.top
# Created Time : 2017-12-06 11:27:32
# Description:
#############################################################

read -p "请输入第一个整数:" NUM1
expr 1 + $NUM1 &>/dev/null
if [ $? -eq 2 ]
then
echo "$NUM1 不是整数 "
exit 2
fi

read -p "请输入第二个整数:" NUM2
expr 1 + $NUM2 &>/dev/null
if [ $? -eq 2 ]
then
echo "$NUM2 不是整数 "
exit 2
fi

# 判断输入数值大小
if [ $NUM1 -eq $NUM2 ]
then
echo "$NUM1 = $NUM2"
exit
fi

if [ $NUM1 -gt $NUM2 ]
then
echo "$NUM1 > $NUM2"
exit
fi
"panduan5.sh" 43L, 962C written
[root@client script]# bash panduan5.sh
请输入第一个整数:4
请输入第二个整数:9
4 < 9

 示例脚本二:

 

[root@client script]# vi if_panduan_2.sh
#!/bin/bash
#############################################################
# File Name: if_panduan_2.sh
# Version: V1.0
# Author: clsn
# Organization: http://blog.znix.top
# Created Time : 2017-12-06 11:27:32
# Description:
#############################################################

read -p "请输入第一个整数:" NUM1
expr 1 + $NUM1 &>/dev/null
if [ $? -eq 2 ]
then
echo "$NUM1 不是整数 "
exit 2
fi

read -p "请输入第二个整数:" NUM2
expr 1 + $NUM2 &>/dev/null
if [ $? -eq 2 ]
then
echo "$NUM2 不是整数 "
exit 2
fi

# 判断输入数值大小
if [ $NUM1 -eq $NUM2 ]
then
echo "$NUM1 = $NUM2"
exit
else
if [ $NUM1 -gt $NUM2 ]
then
echo "$NUM1 > $NUM2"
exit
else
if [ $NUM1 -lt $NUM2 ]
then
echo "$NUM1 < $NUM2"
fi
fi
fi
"if_panduan_2.sh" 43L, 1072C written
[root@client script]# bash if_panduan_2.sh
请输入第一个整数:7
请输入第二个整数:0
7 > 0

示例脚本三: 

 

[root@client script]# vi if_panduan_2.sh
#!/bin/bash
#############################################################
# File Name: if_panduan_2.sh
# Version: V1.0
# Author: clsn
# Organization: http://blog.znix.top
# Created Time : 2017-12-06 11:27:32
# Description:
#############################################################

read -p "请输入第一个整数:" NUM1
expr 1 + $NUM1 &>/dev/null
if [ $? -eq 2 ]
then
echo "$NUM1 不是整数 "
exit 2
fi

read -p "请输入第二个整数:" NUM2
expr 1 + $NUM2 &>/dev/null
if [ $? -eq 2 ]
then
echo "$NUM2 不是整数 "
exit 2
fi

# 判断输入数值大小
if [ $NUM1 -eq $NUM2 ]
then
echo "$NUM1 = $NUM2"
exit
elif [ $NUM1 -gt $NUM2 ]
then
echo "$NUM1 > $NUM2"
exit
elif [ $NUM1 -lt $NUM2 ]
then
echo "$NUM1 < $NUM2"
fi

[root@client script]# bash if_panduan_2.sh
请输入第一个整数:10
请输入第二个整数:20
10 < 20

 

模拟编写启动nginx脚本

 

[root@client script]# cat nginx.sh
#!/bin/bash
##############################################################
# File Name: nginx.sh
# Version: V1.0
# Author: clsn
# Organization: http://blog.znix.top
# Created Time : 2017-12-05 20:56:06
# Description:
##############################################################
. /etc/init.d/functions

StartCheck=`netstat -lntup |grep -c 80`
StartCMD='/usr/local/nginx/sbin/nginx '
StopCMD='/usr/local/nginx/sbin/nginx -s stop '
StatusCheck=`netstat -lntp|grep -c nginx`
ReloadCMD='/usr/local/nginx/sbin/nginx -s reload'
CheckCMD='/usr/local/nginx/sbin/nginx -t'
UsaGe="Usage: $0 {start|stop|status|reload|check}"


COMMAND=$1

if [ $# -ne 1 ]
then
echo $UsaGe && exit 2
fi

if [ $COMMAND = start ]
then
if [ $StartCheck == 1 ]
then
action "启动Nginx失败,端口被占用" /bin/false
else
$StartCMD
action "启动Nginx" /bin/true
fi
elif [ $COMMAND = stop ]
then
$StopCMD &>/dev/null
if [ $? -eq 0 ]
then
action "停止Nginx" /bin/true
else
action "停止Nginx" /bin/false
fi
elif [ $COMMAND = status ]
then
if [ $StatusCheck -eq 1 ]
then
echo "nginx 正在运行..."
else
echo "Nginx 未运行."
fi
elif [ $COMMAND = reload ]
then
$ReloadCMD
action "reload" /bin/true
elif [ $COMMAND = check ]
then
$CheckCMD
else
echo $UsaGe
exit 2
fi

[root@client script]# chmod 755 nginx.sh
[root@client script]# ./nginx.sh
Usage: ./nginx.sh {start|stop|status|reload|check}
[root@client script]# ./nginx.sh stop
停止Nginx [ 确定 ]
[root@client script]# ./nginx.sh start
启动Nginx [ 确定 ]
[root@client script]# ./nginx.sh check
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

 

Web及MySQL服务异常监测案例

用if条件语句实现对Nginx Web服务以及MySQL数据库服务是否正常进行检测,如果服务未启动,则启动相应服务。

脚本编写思路:

 

判断web服务器正常 ↓

  1、进程 ps -ef |grep [n]ginx
  2、端口  netstat  ss losf telnet  nc  nmap 
  3、curl 页面 返回值
  4、curl check.html 的内容

判断mysql服务器正常 ↓

    1、端口 netstat  ss losf telnet  nc  nmap
    2、进程 ps -ef |grep [m]ysql
    3、mysql 登录访问看一下
    4、mysql insert一个数据 select一个数据

web服务监控脚本示例 

 

[root@client script]# cat web_check.sh
#!/bin/bash
#############################################################
# File Name: web_check.sh
# Version: V.
# Author: clsn
# Organization: http://blog.znix.top
# Created Time : -- ::
# Description:
#############################################################
. /etc/init.d/functions

JinChen=`ps -ef |grep -c [n]ginx`
QiDong='/usr/local/nginx/sbin/nginx'
StatuS=`curl -I -w "%{http_code}\n" -o /dev/null -s 192.168.1.220`
StatuS2=`curl -s 192.168.1.220/index.html|grep -c ok`
StartNginx='/server/script/nginx.sh start'

if [ $JinChen -ge 2 ]
then
if [ "$StatuS" -eq 200 ]
then
if [ "$StatuS2" -eq 1 ]
then
action "Nginx 服务运行正常" /bin/true
else
action "请检查chenk.html文件!" /bin/false
fi
else
action "请检查首页文件!" /bin/false
fi
else
action "Nginx 未正常运行!" /bin/false
$StartNginx
fi

[root@client script]# ./web_check.sh
Nginx 服务运行正常 [ 确定 ]
[root@client script]# ./nginx.sh stop
停止Nginx [ 确定 ]
[root@client script]# ./web_check.sh
Nginx 未正常运行! [失败]
启动Nginx [ 确定 ]

 case条件结构语句

 

复制代码
case "字符串变量" in 
  值1)
     指令1
     ;;
  值2)
     指令2
     ;;
  值*)
     指令
esac
复制代码

1.3.2 case与if的对比

case书写方式

复制代码
case $name in
  值1) 
      指令1
      ;;
  值2) 
      指令2
      ;;
   *) 
      指令
esac
复制代码

if书写方式

复制代码
if [ $name == "值1" ]
  then 
    指令1
elif [ $name == "值2" ]
  then 
    指令2
else
    指令    
fi
复制代码

1.3.3 case值的书写方式

apple)

      echo -e "$RED_COLOR apple $RES"

      ;;

也可以这样写,输入2种格式找同一个选项

apple|APPLE)

      echo -e "$RED_COLOR apple $RES"

      ;;

 

case语句小结

  •     case语句就相当于多分支的if语句。case语句的优势是更规范、易读。
  •     case语句适合变量的值少,且为固定的数字或字符串集合。(1,2,3)或(start,stop,restart)。
  •        系统服务启动脚本传参的判断多用case语句,多参考rpcbind/nfs/crond脚本;菜单脚本也可以使用case

 使用case编写一个菜单脚本

 

[root@ljj scripts]# cat menu.sh
#!/bin/bash
#############################################################
# File Name: menu.sh
# Version: V.
# Author: clsn
# Organization: http://blog.znix.top
# Created Time : -- ::
# Description:
#############################################################


#cat<<EOF
echo "1. install rsync"
echo "2. install nfs"
echo "3. install mysql"
echo "4. install all"
#EOF

read -p '请输入你的选择:' chs

case $chs in
1)
echo install rsync success
;;
2)
echo install nfs success
;;
3)
echo install mysql success
;;
4)
echo install rsync/nfs/mysql success
;;
*)
echo "你输入有误"
esac

[root@ljj scripts]# bash menu.sh
1. install rsync
2. install nfs
3. install mysql
4. install all
请输入你的选择:1
install rsync success

输出带有颜色的水果菜单

 

[root@ljj scripts]# vi fruits.sh

#!/bin/bash
#############################################################
# File Name: fruits.sh
# Version: V.
# Author: clsn
# Organization: http://blog.znix.top
# Created Time : -- ::
# Description:
#############################################################
#cat <<EOF
echo "======================="
echo "1.apple"
echo "2.pear"
echo "3.banana"
echo "4 .exit"
echo "======================="
#EOF
read -t 10 -p "你要看什么水果:" Menu_Num

case "$Menu_Num" in
1)
echo -e "\033[31m apple \033[0m"
;;
2)
echo -e "\033[32m pear \033[0m"
;;
3)
echo -e "\033[33m banana \033[0m"
;;
4)
exit
esac 

[root@ljj scripts]# bash fruits.sh
=======================
1.apple
2.pear
3.banana
4 .exit
=======================
你要看什么水果:3
banana

写脚本规范及注意事项

1.变量名称不能和系统已经存在的命令等重复  free  == > Free

  2. 判断单位要统一

  3. 脚本一行不超过一屏的一半。

  4. 能写成变量的内容尽量写成变量

监控Memcached缓存服务是否正常

  监控Memcached缓存服务是否正常,模拟用户(web客户端)检测。

  使用nc命令加上set/get来模拟检测。

    memecached安装:http://www.cnblogs.com/clsn/p/7999510.html

脚本内容:

 

vim  memcache_check.sh 
 #!/bin/bash
 #############################################################
 # File Name: memcache_check.sh
 # Version: V1.0
  # Author: clsn
  # Organization: http://blog.znix.top
  # Created Time : 2017-12-07 15:50:03
  # Description:
 #############################################################
 . /etc/init.d/functions
 . /etc/init.d/run  # 函数 jingdutiao 使用
 MemPort=`netstat -lntp  |grep -c  0.0.0.0:11211`
 Set_Key='printf "set clsn2017 0 10 8\r\nclsn2018\r\n"|nc 10.0.0.180 11211'
 Get_Key='printf "get clsn2017\r\n" |nc 10.0.0.180 11211 |grep -c clsn2018'
 ReStart='systemctl restart memcached.service'

 if [ $MemPort -eq 1 ]
   then
     $Set_Key
     $Get_Key
     if [ $? -ne 1 ]
       then
       action "Memcached 运行正常!" /bin/true
     else
       action "Memcached 服务异常!"  /bin/false
     fi
 else
     action "服务未启动!" /bin/false
     $ReStart
     jingdutiao
 fi

 未测试过。

使用(case)编写rsync管理脚本

 

写网络服务独立进程模式下Rsync的系统启动脚本,例如:/etc/init.d/rsyncd {start|stop|restart}。

要求:

  1.要使用系统函数库技巧。

  2.要用函数,不能一坨💩的方式。

  3.在centos 6中 可被chkconfig管理。

 

服务的停止操作和启动操作之间要有间隔时间,使用sleep 1                   

pkill 进程

 sleep 1

start 服务

 

[root@ljj scripts]# vi rsyncd

#!/bin/bash
#############################################################
# File Name: rsync_admin.sh
# Version: V1.0
# Author: clsn
# Organization: http://blog.znix.top
# Created Time : 2017-12-07 18:39:37
# Description:
#############################################################

. /etc/init.d/functions

Rsync_Port=`netstat -lntup |grep -c 0.0.0.0:873`
Rsync_COM1='rsync --daemon'
Rsync_COM2='pkill rsync'

Rsync_Start() {
Rsync_Port1=`netstat -lntup |grep -c 0.0.0.0:873`
if [ $Rsync_Port1 -ne 0 ]
then
echo "服务已启动"
exit 3
else
$Rsync_COM1
echo "Rsync 启动"
fi
}

Rsync_Stop() {
Rsync_Port2=`netstat -lntup |grep -c 0.0.0.0:873`
if [ $Rsync_Port2 -eq 0 ]
then
echo "服务未启动"
exit 3
else
$Rsync_COM2
echo "Rsync 停止“
fi
}

Rsync_Status() {
if [ $Rsync_Port -eq 1 ]
then
echo "Rsync 服务运行中..."
else
echo "Rsync 服务未运行"
fi
}

Rsync_Restart() {
Rsync_Stop
Rsync_Start
}

COMMAND=$1

case "$COMMAND" in
start)
Rsync_Start
;;
stop)
Rsync_Stop
;;
status)
Rsync_Status
;;
restart|reload|force-reload)
Rsync_Restart
;;
*)
echo "Usage: $0 {start|stop|status|restart|reload|force-reload}"
exit 2
;;
esac

菜单自动化软件部署脚本实践

 

综合实例:打印选择菜单,按照选择一键安装不同的Web服务。

示例菜单:

[root@oldboy scripts]# sh menu.sh

    1.[install lamp]

    2.[install lnmp]

    3.[exit]

    pls input the num you want:

要求:

  1、当用户输入1时,输出“start installing lamp.提示”然后执行/server/scripts/lamp.sh,脚本内容输出"lampis installed"后退出脚本,工作中就是正式lamp一键安装脚本;

echo 'echo lampis installed' > /server/scripts/lamp.sh
chmod +x /server/scripts/lamp.sh

  2、当用户输入2时,输出“start installing lnmp.提示” 然后执行/server/scripts/lnmp.sh输出"lnmpis installed"后退出脚本,工作中就是正式lnmp一键安装脚本;

echo 'echo lnmpis installed' > /server/scripts/lnmp.sh
chmod +x /server/scripts/lnmp.sh

  3、当输入3时,退出当前菜单及脚本;  

  4、当输入任何其它字符,给出提示“Input error”后退出脚本;

  5、要对执行的脚本进行相关的条件判断,例如:脚本文件是否存在,是否可执行等判断。

 

[root@ljj scripts]# cat menu1.sh
#!/bin/bash
#############################################################
# File Name: menu.sh
# Version: V.
# Author: clsn
# Organization: http://blog.znix.top
# Created Time : -- ::
# Description:
#############################################################

#cat <<EOF
echo "1.[install lamp]"
echo "2.[install lnmp]"
echo "3.[exit]"
#EOF

read -p "please input the num you want:" Num

case "$Num" in
1)
if [ -f /server/scripts/lamp.sh ]
then
echo -e "033\[36mstart installing lamp033\[0m"
/server/scripts/lamp.sh
else
echo -e "\033[4;41;37m /server/scripts/lamp.sh 文件不存在 \033[0m"
fi
;;
2)
if [ -f /server/scripts/lnmp.sh ]
then
echo -e "033\[mstart installing lnmp\033[0m"
/server/scripts/lnmp.sh
else
echo -e "\033[5;41;37m /server/scripts/lnmp.sh 文件不存在 \033[0m"
fi
;;
3)
exit
;;
*)
echo -e "\033[31mInput error \033[0m"
exit
esac

[root@ljj scripts]# bash menu1.sh
1.[install lamp]
2.[install lnmp]
3.[exit]
please input the num you want:2
/server/scripts/lnmp.sh 文件不存在

 if 与 case 对比

  if 语句类似黑名单,需要把这种错误场景封堵

  case 语句类似白名单,只要把正确结果列完整即可

 其他补充说明

[root@ljj scripts]# echo $RANDOM
8965
[root@ljj scripts]# echo $RANDOM
21986
[root@ljj scripts]# echo $RANDOM
28971

echo 命令输出带颜色字符

 彩色字体

[root@ljj scripts]# echo -e "\033[30m 黑色字 clsn \033[0m"
黑色字 clsn
[root@ljj scripts]# echo -e "\033[31m 红色字 clsn \033[0m"
红色字 clsn
[root@ljj scripts]# echo -e "\033[32m 绿色字 clsn \033[0m"
绿色字 clsn
[root@ljj scripts]# echo -e "\033[33m 黄色字 clsn \033[0m"
黄色字 clsn
[root@ljj scripts]# echo -e "\033[34m 蓝色字 clsn \033[0m"
蓝色字 clsn
[root@ljj scripts]# echo -e "\033[35m 紫色字 clsn \033[0m"
紫色字 clsn
[root@ljj scripts]# echo -e "\033[36m 天蓝字 clsn \033[0m"
天蓝字 clsn
[root@ljj scripts]# echo -e "\033[37m 白色字 clsn \033[0m"
白色字 clsn

 彩色底纹

[root@ljj scripts]# echo -e "\033[40;37m 黑底白字 clsn \033[0m"
黑底白字 clsn
[root@ljj scripts]# echo -e "\033[41;37m 红底白字 clsn \033[0m"
红底白字 clsn
[root@ljj scripts]# echo -e "\033[42;37m 绿底白字 clsn \033[0m"
绿底白字 clsn
[root@ljj scripts]# echo -e "\033[43;37m 黄底白字 clsn \033[0m"
黄底白字 clsn
[root@ljj scripts]# echo -e "\033[44;37m 蓝底白字 clsn \033[0m"
蓝底白字 clsn
[root@ljj scripts]# echo -e "\033[45;37m 紫底白字 clsn \033[0m"
紫底白字 clsn
[root@ljj scripts]# echo -e "\033[46;37m 天蓝白字 clsn \033[0m"
天蓝白字 clsn

 特效字体

\033[0m 关闭所有属性
\033[1m 设置高亮度
\033[4m 下划线
\033[5m 闪烁
\033[7m 反显
\033[8m 消隐
\033[30m — \033[37m 设置前景色
\033[40m — \033[47m 设置背景色
\033[nA 光标上移 n 行
\033[nB 光标下移 n 行
\033[nC 光标右移 n 行
\033[nD 光标左移 n 行
\033[y;xH 设置光标位置
\033[2J 清屏
\033[K 清除从光标到行尾的内容
\033[s 保存光标位置
\033[u 恢复光标位置
\033[?25l 隐藏光标
\033[?25h 显示光标

显示文本中的隐藏字符

使用cat命令查看文本中的隐藏字符

[root@clsn ~]# cat --help
用法:cat [选项]... [文件]...
将[文件]或标准输入组合输出到标准输出。

  -A, --show-all           等于-vET
  -b, --number-nonblank    对非空输出行编号
  -e                       等于-vE
  -E, --show-ends          在每行结束处显示"$"
  -n, --number             对输出的所有行编号
  -s, --squeeze-blank      不输出多行空行
  -t                       与-vT 等价
  -T, --show-tabs          将跳格字符显示为^I
  -u                       (被忽略)
  -v, --show-nonprinting   使用^ 和M- 引用,除了LFD和 TAB 之外
使用cat -A查看隐藏的字符

[root@ljj scripts]# cat -A /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4$
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6$

关于隐藏字符常见错误

在windows中编写的脚本换行使用的是 \r\n

         但是在linux中使用\n 进行换行

[root@ljj scripts]# cat -A clsn.sh
#!/bin/bash$
#############################################################$
# File Name: clsn.sh$
# Version: V1.0$
# Author: clsn$
# Organization: http://blog.znix.top$
# Created Time : 2017-12-05 12:13:38$
# Description:$
#############################################################$
dir=$
echo ${dir:-/tmp}$
echo ${dir}$
echo ${dir:=/mnt}$
echo ${dir}$
dir2= $
echo ${dir2-/tmp}$
echo ${dir2}$
echo ${dir2:-/tmp}$
echo ${dir2}$
echo ${dir2=/mnt}$
echo ${dir2}$

使用dos2unix 把windows上的脚本转化linux格式

[root@ljj scripts]# dos2unix fruits.sh
dos2unix: converting file fruits.sh to Unix format ...

转换后,脚本的内容隐藏内容改变。

[root@ljj scripts]# cat -A fruits.sh
#!/bin/bash$
#############################################################$
# File Name: fruits.sh$
# Version: V.$
# Author: clsn$
# Organization: http://blog.znix.top$
# Created Time : -- ::$
# Description:$
#############################################################$
#cat <<EOF$
echo "======================="$
echo "1.apple"$
echo "2.pear"$
echo "3.banana"$
echo "4 .exit"$
echo "======================="$
#EOF$
read -t 10 -p "M-dM-=M- M-hM-&M-^AM-gM-^\M-^KM-dM-;M-^@M-dM-9M-^HM-fM-0M-4M-fM-^^M-^\:" Menu_Num$
$
case "$Menu_Num" in $
1)$
echo -e "\033[31m apple \033[0m"$
;;$
2)$
echo -e "\033[32m pear \033[0m"$
;;$
3)$
echo -e "\033[33m banana \033[0m" $
;;$
4)$
exit$
esac$

排错技巧

sh -x  脚本.sh

 -x 开启脚本调试模式

cat -A  文件.txt

-A  查看文件的隐藏字符

1.5.5 shell 脚本段注释方法

方法一:

<<EOF
  内容
EOF

方法二:

一行注释方法 → : '内容'
段注释方法 ↓
:' 
 http://blog.znix.top
'

:命令的说明

[root@clsn scripts]# help :
:: :
    空的命令。
    
    没有效果; 此命令不做任何操作。
    
    退出状态:
    总是成功。

:命令的应用场景

if 条件
  then 
    :
else
    命令
fi

1.5.6 其他补充

  类进度条效果

yum install -y pv 
echo {1..20}|pv -qL 15

  clear 命令

清屏 == ctrl + l
http://man.linuxde.net/curl
https://www.abcdocker.com/abcdocker/206
http://www.cnblogs.com/clsn/p/7750615.html
http://blog.51cto.com/oldboy/1867160 (部分练习题目来源)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 



















































































 

posted @   星火撩原  阅读(142)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示

目录导航