shell编程基础二(条件结构篇)

转自大神博客:https://www.cnblogs.com/clsn/p/8006210.html

1.条件表达式

1.文件判断

常用文件测试操作符

 

 判断文件是否存在

[root@linux-test-no data]# [ -f /data/test1.txt ]
[root@linux-test-no data]# echo $?
0            #代表/data/test1.txt文件存在
[root@linux-test-no data]# [ -f /data/test2.txt ]
[root@linux-test-no data]# echo $?
1            #代表/data/test2.txt文件不存在

判断文件是否存在,逻辑判断的方式返回结果

[root@clsn scripts]# [ -f /etc/hosts ] && echo "文件存在" || echo "文件不存在" 
文件存在
[root@clsn scripts]# [ -f /etc/hosts1 ] && echo "文件存在" || echo "文件不存在" 
文件不存在

判断目录是否存在,逻辑判断的方式返回结果

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

使用变量的方法进行判断

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

2.字符串判断

字符串测试操作符

 

 -z 判断字符串长度

[root@linux-test-no data]# x=1; [ -z "$x" ] && echo "输入为空" || echo "输入有内容"
输入有内容
[root@linux-test-no data]# x= ; [ -z "$x" ] && echo "输入为空" || echo "输入有内容"
输入为空

-n判断字符串长度

[root@linux-test-no data]# x=1; [ -n "$x" ] && echo "输入有内容" || echo "输入为空"
输入有内容
[root@linux-test-no data]# x= ; [ -n "$x" ] && echo "输入有内容" || echo "输入为空"
输入为空

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

 

cmd=$1
[ "$cmd" == "start" ] && echo start
# 测试
[root@clsn scripts]# cmd=start;[ "$cmd" == "start" ] && echo start
start

3.整数判断

整数二元比较操作符参考

 

 

 判断两数是否相等

[root@clsn scripts]# [ 1 -eq 1 ]
[root@clsn scripts]# echo $?
0
[root@clsn scripts]# [ 1 -eq 2 ]
[root@clsn scripts]# echo $?
1

大于等于

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

小于

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

大于

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

不等于

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

4.逻辑符号

常用逻辑操作符

 

 

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

 

#这个下面&&符号的意义是如果&&前面的结果为真就执行后面的命令,反之不执行,||符号的意思就是||前面的结果为真,就不执行||后面的命令
反之同理。

 

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

 

 取反

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

两边都为真

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

至少有一边为真

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

感叹号的特殊用法

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

[root@clsn ~]#  !516
 ls
anaconda-ks.cfg  bootime.avg  setup.sh  vim

5.综合练习

开发3个shell脚本比较2个整数大小

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

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

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

使用定义变量方法

[root@linux-test-no data]# cat panduan1.sh
#!/bin/bash
num1=2
num2=1 
#这条命令的意思是利用expr计算时变量或字符串必须为整数的规则,把变量和一个整数(非零)相加,判断命令返回状态码是否为2,如果是2的话,就代表变量或者字符串不是整数。
&> /dev/null的作用是expr的标准输出和标准错误输出都导入到黑洞文件中。

expr 1 + $num1 &> /dev/null [ $? -eq 2 ] && echo "num1 不是整数" && exit 2 expr 1 + $num2 &> /dev/null [ $? -eq 2 ] && echo "num2 不是整数" && exit 2 [ $num1 -gt $num2 ] && echo "$num1 大于 $num2" && exit [ $num1 -eq $num2 ] && echo "$num1 等于 $num2" && exit [ $num1 -lt $num2 ] && echo "$num1 小于 $num2"

使用传参的方式

[root@linux-test-no data]# bash panduan2.sh 3 7
3 小于 7
[root@linux-test-no data]# cat panduan2.sh
#!/bin/bash
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 -gt $num2 ] && echo "$num1 大于 $num2" && exit
[ $num1 -eq $num2 ] && echo "$num1 等于 $num2" && exit
[ $num1 -lt $num2 ] && echo "$num1 小于 $num2"

使用read读入

[root@linux-test-no data]# cat panduan3.sh
#!/bin/bash
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 -gt $num2 ] && echo "$num1 大于 $num2" && exit
[ $num1 -eq $num2 ] && echo "$num1 等于 $num2" && exit
[ $num1 -lt $num2 ] && echo "$num1 小于 $num2"

2.if条件语句

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

1.三种语法

 单分支语句

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

 

2.三种语法小结

单分支:一个条件一个结果,如果条件为真,就执行结果,否则直接退出。

双分支:一个条件两个结果,如果条件为真,就执行第一个结果后退出,如果为假,就执行第二个结果后退出。

多分支:多个条件多个结果,如果条件为真,就执行第一个结果后退出,如果为假,就执行后面的条件判断,并根据判断结果决定后续是接着判断下一个条件,还是就直接返回结果就退出了。

 

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

单分支实例脚本:

[root@linux-test-no data]# cat Single_branch.sh
#!/bin/bash
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 -gt $num2 ];then
echo " $num1 大于 $num2 "
exit
fi
if [ $num1 -lt $num2 ];then
echo " $num1 小于 $num2 "
exit
fi
if [ $num1 -eq $num2 ];then
echo " $num1 等于 $num2 "
exit
fi
if单分支判断

双分支实例脚本

[root@linux-test-no data]# cat Double_branch.sh
#!/bin/bash
read -p "请输入第一个整数: " num1
expr 1 + $num1 &> /dev/null
if [ $? -eq 2 ];then
echo " $num1 不是整数,请检查!"
exit 2
else
read -p "请输入第二个整数 :" num2
expr 1 + $num2 &> /dev/null
if [ $? -eq 2 ];then
echo "$num2 不是整数,请检查!"
exit 2
fi
fi
if [ $num1 -gt $num2 ];then
echo "$num1 大于 $num2"
exit
else
if [ $num1 -lt $num2 ];then
echo " $num1 小于 $num2"
exit
else
echo " $num1 等于 $num2"
exit
fi
fi
if双分支判断

多分支实例脚本

[root@linux-test-no data]# cat Many_branches.sh
#!/bin/bash
read -p "请输入第一个整数:" num1
expr 1 + $num1 &> /dev/null
if [ $? -eq 2 ];then
echo " $num1 不是整数,请检查!"
exit 2
else
read -p "请输入第二个整数: " num2
expr 1 + $num2 &> /dev/null
if [ $? -eq 2 ];then
echo " $num2 不是整数,请检查! "
exit 2
fi
fi
if [ $num1 -gt $num2 ];then
echo " $num1 大于 $num2 "
exit
elif [ $num1 -lt $num2 ];then
echo " $num1 小于 $num2 "
exit
elif [ $num1 -eq $num2 ];then
echo " $num1 等于 $num2 "
exit
fi
if 多分支判断

4.练习题2(系统内存低于100M邮件报警,加入计划任务,3分钟检查一次)

对于开发程序而言,一般来说应该遵循下面的3步法则。

1)分析需求

    明白开发需求,是完成程序的大前提,因此,分析需求至关重要,一切不以需求为主的程序开发,都是耍流氓的!

(2)设计思路

设计思路就是根据需求,把需求进行拆解,分模块逐步实现,例如本题可以分为如下几步:

1)获取当前系统剩余内存的值(先在命令行实现)。

2)配置邮件报警(可采用第三方邮件服务器)。

3)判断取到的值是否小于100MB,如果小于100MB,就报警(采用if语句)。

4)编码实现Shell脚本。

5)加入crond定时任务,每三分钟检查一次。

(3)编码实现

    编码实现就是具体的编码及调试过程,工作中很可能需要先在测试环境下调试,调试好了,再发布到生产环境中。

第一步配置好邮件服务,保证你能发出邮件提醒,配置过程和验证过程这里就跳过了,比较简单。

第二步编写脚本,脚本如下

[root@linux-test-no data]# cat mem_info.sh
#!/bin/bash
Mem=`free -m |awk 'NR==2{print $NF}'`
host=`hostname`
Ip=`hostname -I`
Date=`date +%F_%T`
mail_file=/tmp/mail.s
dest_user=admin@znix.top

if [ $Mem -lt 100 ]
then
   echo "发生时间: $Date" >$mail_file
   echo "发生主机: $host  主机IP地址: $Ip " >> $mail_file
   echo "内存余量: $Mem M" >> $mail_file
   mail -s "【警告】内存不足了呀!"  $dest_user < $mail_file
fi

第三步,就是验证脚本可行性

第四步,脚本测试成功,写入定时任务

至此一个监控脚本就写好了

5.练习题3(模拟编写启动nginx脚本)

 脚本内容

[root@linux-test-no data]# cat nginx.sh
#!/bin/bash
#下面语句的作用是调用函数,这里调用的是下面的action函数。 .
/etc/init.d/functions StartCheck=`netstat -lntup |grep -c 80` StartCMD='/application/nginx/sbin/nginx ' StopCMD='/application/nginx/sbin/nginx -s stop ' StatusCheck=`netstat -lntp|grep -c nginx` ReloadCMD='/application/nginx/sbin/nginx -s reload' CheckCMD='/application/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 -ge 1 ] then
#action函数的作用是,打印某个信息并执行给定的命令,它会根据命令执行的结果来调用 success,failure方法。这里的作用就是根据上面的判断返回
对应信息,并根据信息返回退出码。 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

6.练习题4(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@clsn scripts]# cat  web_check.sh 
#!/bin/bash #############################################################
# File Name: web_check.sh
# Version: V1.0
# Author: clsn
# Organization: http://blog.znix.top
# Created Time : 2017-12-07 10:53:38
# Description: #############################################################
. /etc/init.d/functions
JinChen=`ps -ef |grep -c  [n]ginx`
QiDong='/server/scripts/nginx.sh start'
StatuS=`curl -I -w "%{http_code}\n" -o /dev/null -s   10.0.0.180`
StatuS2=`curl -s 10.0.0.180/check.html|grep -c ok`
StartNginx='/server/scripts/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
View Code

 

3.case条件结构语句

1.case语法结构

case "字符串变量" in     #这里的语法结构的意思就是当变量的值为下面不同的值时,执行不同的指定。
  值1)
     指令1
     ;;
  值2)
     指令2
     ;;
  值*)
     指令
esac

 

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

3.case值的书写方式

apple)

      echo -e "$RED_COLOR apple $RES"

      ;;

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

apple|APPLE)

      echo -e "$RED_COLOR apple $RES"

      ;;

4.case语句小结

  😋 case语句就相当于多分支的if语句。case语句的优势是更规范、易读。

  😋 case语句适合变量的值少,且为固定的数字或字符串集合。(1,2,3)或(start,stop,restart)。

  😋 系统服务启动脚本传参的判断多用case语句,多参考rpcbind/nfs/crond脚本;菜单脚本也可以使用case

5.练习题1(使用case编写一个菜单脚本)

[root@linux-test-no data]# cat caidan.sh
#/bin/bash
cat<<JIESHU
1.你输入的是1
2.你输入的是2
3.你输入的是3
JIESHU
read -p '请输入你选择的数字' shuzi
case $shuzi in
1)
echo "你输入的是1"
;;
2)
echo "你输入的是2"
;;
3)
echo "你输入的是3"
;;
*)
echo "你输入错误"
esac

6.写脚本的规范及注意事项

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

2. 判断单位要统一

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

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

 

4.条件判断结构脚本练习题

1.【练习题1】监控Memcached缓存服务是否正常

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

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

脚本内容

[root@linux-test-no data]# cat memcache_check.sh
#!/bin/bash
. /etc/init.d/functions    #此脚本的作用是/etc/init.d里边的文件使用的,提供了一些基础的功能
. /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'    #这个变量的作用是存储数据到监控的memcache服务中去
Get_Key='printf "get clsn2017\r\n" |nc 10.0.0.180 11211 |grep -c clsn2018'    #这个变量的作用从监控的mencache服务中,获取刚刚存储的数据,并看是否可以获取到对应数据
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

 

2.【练习题2】使用(case)编写rsync管理脚本

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

要求:

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

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

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

注意:

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

pkill 进程

 sleep 1

start 服务

rsync服务管理脚本

 

[root@linux-test-no data]# cat rsyncd
#!/bin/bash
. /etc/init.d/functions
. /etc/init.d/run

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
       action  "服务已启动" /bin/false
       exit 3
    else
       $Rsync_COM1
       #action  "Rsync 启动" /bin/true
       QiDong
    fi
 }

Rsync_Stop() {
    Rsync_Port2=`netstat -lntup |grep -c  0.0.0.0:873`
    if [ $Rsync_Port2 -eq 0 ]
      then
        action  "服务未启动" /bin/false
        exit 3
    else
        $Rsync_COM2
        #action  "Rsync 停止" /bin/true
        TingZhi
    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
View Code

 

 

3.【练习题3】菜单自动化软件部署脚本实践

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

示例菜单:

[root@oldboy scripts]# sh deploy.sh

    1.[install lamp]

    2.[install lnmp]

    3.[exit]

    请输入你选择的数字:

要求:

  1、当用户输入1时,输出“install lamp”然后执行/data/lamp.sh,脚本内容输出"lamp安装成功"后退出脚本,工作中就是正式lamp一键安装脚本

[root@linux-test-no data]# cat lamp.sh
#!/bin/bash
echo "lamp安装成功"
[root@linux-test-no data]# chmod +x lamp.sh

    2、当用户输入2时,输出“install lnmp” 然后执行/data/lnmp.sh输出"lnmp安装完成"后退出脚本,工作中就是正式lnmp一键安装脚本;

[root@linux-test-no data]# cat lnmp.sh
#!/bin/bash
echo "lnmp安装完成"
[root@linux-test-no data]# chmod +x lnmp.sh

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

  4、当输入任何其它字符,给出提示“请输入正确的数字”后退出脚本;

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

 

 

脚本内容

[root@linux-test-no data]# cat deploy.sh
#!/bin/bash
cat<<JS
1.[install lamp]

2.[install lnmp]

3.[exit]
JS
read -p "请输入你选择的数字" num
case $num in
1)
if [ -f /data/lamp.sh ]
    then
    echo "install lamp"
    /data/lamp.sh
else
   echo "/data/lamp.sh此文件不存在,请检查!"
fi
;;

2)
if [ -f /data/lnmp.sh ]
then
echo "install lnmp"
/data/lnmp.sh
else
echo "/data/lnmp.sh此脚本不存在,请检查!"
fi
;;
3)
exit
;;
*)
echo "请输入正确的数字"
exit 2
esac

 

5.其他脚本中常用技巧补充说明

1.linux中产生随机数的方法

[root@linux-test-no data]# echo $RANDOM
10742
[root@linux-test-no data]# echo $RANDOM
32293

2.echo命令输出带颜色

echo加-e的作用是激活转义字符,而不是把他当成普通字符直接输出

#彩色字体

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

效果示意图

 

 #彩色底纹

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

效果示意图

 

 

#特效字体

\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 显示光标

部分效果示意图

 

3.显示文本中的隐藏字符

使用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@clsn ~]# cat -A /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4$
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6$
10.0.0.1 mirrors.aliyuncs.com mirrors.aliyun.com$
10.0.0.180 clsn$

关于隐藏字符常见错误

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

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

[root@clsn ~]# cat -A windowe.sh 
n1=2^M$
n2=1^M$
^M$
[ $n1 -gt $n2 ] && echo "$n1 > $n2" && exit^M$
[ $n1 -eq $n2 ] && echo "$n1 = $n2" && exit^M$
echo "$n1 < $n2"^M$

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

[root@clsn ~]# dos2unix windowe.sh 
dos2unix: converting file windowe.sh to Unix format ...

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

[root@clsn ~]# cat -A windowe.sh 
n1=2$
n2=1$
$
[ $n1 -gt $n2 ] && echo "$n1 > $n2" && exit$
[ $n1 -eq $n2 ] && echo "$n1 = $n2" && exit$
echo "$n1 < $n2"$

 

4.脚本排错技巧

sh -x  脚本.sh

 -x 开启脚本调试模式
他会把脚本中的每条命令的执行情况打印出来 

sh -n 脚本.sh

-n 是开启脚本的语法检查
检查脚本中是否有语法错误

cat -A 文件.txt

-A  查看文件的隐藏字符
当脚本检查发现语法错误时,有时候可能因为中文空格缩进类似的错误导致,但是我们肉眼无法看出,这个时候可以通过这个选项,查看文件中的隐藏字符

5.shell 脚本段注释方法

方法1:

<<EOF
  内容
EOF

方法2:

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

:命令的说明

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

:命令的应用场景

if 条件
  then 
    :
else
    命令
fi
上面:在if条件语句中没有任何作用,引出分支。做占位符
在一个 2 元命令中提供一个占位符.

在和 >(重定向操作符)一起使用时, 清空文件, 并没有修改文件的权限, 例如: (如果文件不存在, 将会创建文件)

: > data.log 等同于

cat /dev/null > data.log

6.其他补充

类进度条效果

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

clear 命令

清屏 == ctrl + l
posted @ 2020-10-22 11:38  清白之年980410  阅读(253)  评论(0编辑  收藏  举报