zoukankan      html  css  js  c++  java
  • 【转】shell编程下 特殊变量、test / [ ]判断、循环、脚本排错

    【转】shell编程下 特殊变量、test / [ ]判断、循环、脚本排错

    第1章 shell中的特殊变量

    1.1 $#

    $# 表示参数的个数

    1.1.1 示例】脚本内容

    [root@znix ~]# cat /server/scripts/show2.sh

    #!/bin/bash

    echo $1 $2 $#

    if [ $? == 0 ];then

       echo "OK"

    fi

    实例1-1 执行的不同结果

    [root@znix ~]# sh  /server/scripts/show2.sh  1 2 3 4 6

    1 2 5

    [root@znix ~]# sh  /server/scripts/show2.sh  aa bb

    aa bb 2

    [root@znix ~]# sh  /server/scripts/show2.sh  aa bb cc

    aa bb 3

    1.2 $?

    $?表示:上一个命令执行后的状态

    状态0 表示执行正确

    状态0 表示执行错误

    1.2.1 示例$?的使用

    [root@znix ~]# aaa

    -bash: aaa: command not found

    [root@znix ~]# echo $?

    127

    [root@znix ~]# sed

    Usage: sed [OPTION]... 

    [root@znix ~]# echo $?

    4

    [root@znix ~]# sh  /server/scripts/show2.sh  aa bb

    aa bb 2

    [root@znix ~]# echo $?

    0

    1.3 【了解】编译安装的过程

    切菜备菜  ./configure

    炒菜      make

    上菜      make install

    1.4 如何向变量中存放内容---read命令

    1.4.1 read命令使用

    [root@znix ~]# read a

    惨绿少年

    [root@znix ~]# echo $a

    惨绿少年

    1.4.2 让执行命令后出现提示信息

    -p 为显示提示信息。p作为输出一定要写在其他参数的最后面

    [root@znix ~]# read -p "请输入:" a

    请输入:呵呵                              

    [root@znix ~]# echo $a

    呵呵

    1.4.3 设置等待(超时)的时间

    -t5  等待5

    [root@znix ~]# read -t5 -p "请输入密码:" a

    请输入密码:

    [root@znix ~]#

    [root@znix ~]# read -t5 -p "请输入密码:" a

    请输入密码:123

    1.4.4 不显示输入的内容

    -s  输入的时候不显示输入内容。

    [root@znix ~]# read -s -t50 -p "请输入密码:" a

    请输入密码:

    [root@znix ~]# echo $a

    admin

    1.5 read命令运用到脚本上

    1.5.1 修改计算器脚本的内容,让他能够更智能。

    [root@znix ~]# vim  /server/scripts/cal.sh

    #!/bin/bash

    read -p "input 1st num:" a

    read -p "input 2st num:" b

    1.5.2 测试脚本

    [root@znix ~]# sh  /server/scripts/cal.sh

    input 1st num:1

    input 2st num:2

    0.5

    3

    -1

    2

    1.5.3 简化命令

    1.5.3.1 read 可以同时读入多个字符。

    [root@znix ~]# read -p "输入第一个 第二关数字:" a b

    输入第一个 第二关数字:123 456  

    [root@znix ~]# echo $a $b

    123 456

    1.5.3.2 修改脚本的内容。

    使用一条read命令,读取两个参数。

    [root@znix ~]# vim /server/scripts/cal.sh

    #!/bin/bash

    read -p "input 1st&2st num:" a b

    awk -vnum1=$a -vnum2=$b 'BEGIN{print num1/num2}'

    awk -vnum1=$a -vnum2=$b 'BEGIN{print num1+num2}'

    awk -vnum1=$a -vnum2=$b 'BEGIN{print num1-num2}'

    awk -vnum1=$a -vnum2=$b 'BEGIN{print num1*num2}'

    "/server/scripts/cal.sh" 15L, 355C written 

    1.5.3.3 测试脚本。

    注意 同时传入两个参数的时候,参数之间要使用空格分割.

    [root@znix ~]# sh /server/scripts/cal.sh

    input 1st&2st num:1 2

    0.5

    3

    -1

    2

    第2章 判断一个 文件/目录 是否存在

    2.1 几种思路:

    cat + $?'

    ls  + $?

           test命令

    2.2 test命令实例

    test命令不会自己输出执行的结果,配合$?查询上一条命令是否执行成功,就能够判断是否存在这个文件或目录.

    2.2.1 判断一个文件是否存在

    -f 为判断的对象是文件,0为存在,1为不存在

    [root@znix ~]# test -f /clsn/clsn.txt

    [root@znix ~]# echo $?

    0

    [root@znix ~]# test -f /clsn/clsn

    [root@znix ~]# echo $?

    1

    2.2.2 判断一个目录是否存在

    -d 为对目录进行判断,0为存在,1为不存在.

    [root@znix ~]# test -d /znix

    [root@znix ~]# echo $?

    1

    [root@znix ~]# test `-d /clsn/

    [root@znix ~]# echo $?

    0

    2.3 使用 [  ] 进行判断

    使用[  ]的时候注意中间的空格,两边都要有两个空格

    [  ]test命令的功能相似,可以进行判断,相比test命令更为便捷

    2.3.1 [  ]判断一个文件是否存在

    test命令一样 [  ] 判断的结果也0为存在,1为不存在

    [root@znix ~]# [ -f /zinx.txt ]

    [root@znix ~]# echo $?

    1

    [root@znix ~]# [ -f /root/clsn.txt ]

    [root@znix ~]# echo $?

    0

    2.3.2 判断成功后,执行下一个命令 &&

    判断文件/目录是否存在,判断成功执行后面的内容,输出ok ;判断失败,不执行后面的命令.

    [root@znix ~]# [ -f /clsn/znix.txt ] && echo "ok"

    [root@znix ~]# [ -d /clsn ] && echo "ok"

    ok

    2.3.3 判断不成功后执行下一条命令 ||

    如果这个文件不存在,就创建 (使用 || , || 表示前面的执行错误了,执行后面的命令.

    [root@znix ~]# [ -f /clsn/znix.txt ] || touch /clsn/znix.txt

    [root@znix ~]# ls -l /clsn/znix.txt

    -rw-r--r-- 1 root root 0 Sep 20 10:31 /clsn/znix.txt

    2.3.3.1 [示例1]如果/root/clsndir 目录不存在就创建     

    [root@znix ~]# [ -d /root/clsndir ] || mkdir -p /root/clsndir

    [root@znix ~]# ls -ld /root/clsndir

    drwxr-xr-x 2 root root 4096 Sep 20 10:36 /root/clsndir

    2.3.3.2 [示例2]如果/root/clsndir 目录不存在,就创建这个目录  

    使用 && ,前面的执行成功,执行后面的; ! 表示非,不存在.

    [root@znix ~]# [ ! -d /root/clsndir/1 ] && mkdir  -p /root/clsndir/1

    [root@znix ~]# ll -d /root/clsndir/1

    drwxr-xr-x 2 root root 4096 Sep 20 10:41 /root/clsndir/1

    第3章 判断在脚本的使用

    3.1.1 中文示例(更好理解)

    如果 [ 这个文件存在 ];然后

               提示文件存在

    否则

               创建这个文件

    果如

    3.2 [示例]判断文件是否存在,不存在就创建

    3.2.1 第一步 按照格式书写判断语句

    if [ -f /root/clsn.txt ];then

        echo "文件存在"

    else

        touch /root/clsn.txt

    fi

    3.3 第二步 写入脚本:

    写入脚本的时候,注意脚本的基本格式.

    [root@znix ~]# vim /server/scripts/if.sh

    #!/bin/bash

    if [ -f /root/clsn.txt ];then

        echo "文件存在"

    else

        touch /root/clsn.txt

    fi

    3.3.1 第三步 测试脚本

    [root@znix ~]# sh  /server/scripts/if.sh

    文件存在

    3.4 在脚本中进行判断的格式

    符号

    参数

    含义

    英文

    -gt

    大于  

    great than

    >=

    -ge

    大于等于

    great equal

    -lt

    小于

    less than

    <=

    -le

    小于等于

    less than or equal

    ==

    -eq

    等于  

    equal     

    !=

    -ne / ! -eq

    不等于

    not equal 

    3.5 [实例]如果cal2.sh脚本的参数个数不等于2,就显示 "命令错误"

    3.5.1 书写脚本

    !=  表示判断两个是否不相等,如果不想等就显示命令错误

    #/bin/bash

    if [ $# !=  2 ];then

        echo "命令错误"

    fi

    3.5.2 对脚本进行测试.

    当参数的个数为2的时候,不会输出,个数不为二的时候输出 命令错误

    [root@znix ~]# sh /server/scripts/cal2.sh

    命令错误

    [root@znix ~]# sh /server/scripts/cal2.sh 1 2

    [root@znix ~]# sh /server/scripts/cal2.sh 1 2 3

    命令错误

    3.6 修改之前的计算器,进行两个数字的加减乘除,在计算器前面加上参数个数判断。当输入的参数是2个的时候执行计算,不为2的时候显示参数错误.

    3.6.1 书写脚本

    当输入的参数不为2的时候 执行 echo "Usage: NUM1 NUM2", 然后执行 exit..

    exit 表示前面的执行完成后就结束(跳出),不会再执行脚本后面的内容.

    [root@znix ~]# vim  /server/scripts/cal2.sh   

    #/bin/bash

    if [ $# -ne 2 ];then

        echo "Usage: NUM1 NUM2"

        exit

    fi

    a=$1

    b=$2

    awk -vh=$a -vz=$b 'BEGIN{print h/z}'

    awk -vh=$a -vz=$b 'BEGIN{print h+z}'

    awk -vh=$a -vz=$b 'BEGIN{print h-z}'

    awk -vh=$a -vz=$b 'BEGIN{print h*z}'

    3.6.2 测试脚本

    当输入的参数个数不为2的时候执行echo 命令

    当输入的参数个数为2的时候进行计算

    [root@znix ~]# sh   /server/scripts/cal2.sh

    Usage: NUM1 NUM2   ##提示信息

    [root@znix ~]# sh   /server/scripts/cal2.sh 22 22

    1

    44

    0

    484

    第4章 循环语句

    4.1 [示例]修改系统时间为2017050120170520,然后创建文件的名字为2017-05-01.txt

    4.1.1 基础姿势

    4.1.1.1 for循环可以从后面的数组中读取内容进行操作

    循环的格式     

    for hd in  znix_{a..z}

    do

        echo $hd

    done

    4.1.1.2 执行for 循环语句

    [root@znix ~]# for hd in  znix_{a..z}

    > do

    >     echo $hd

    > done

    znix_a

    znix_b

    znix_c

    znix_d

    ……

    znix_z

    4.1.2 书写循环语句

    do里面可以两条命令同时执行.

    for hd in {01..20}

    do

        date -s "201705$hd"

        touch /tmp/date/$(date +%F).txt

    done

    4.1.3 测试循环语句

    [root@znix ~]# for hd in {01..20}

    > do

    >     date -s "201705$hd"

    >     touch /tmp/date/$(date +%F).txt

    > done

    Mon May  1 00:00:00 CST 2017

    Tue May  2 00:00:00 CST 2017

    Wed May  3 00:00:00 CST 2017

    ……

    Sat May 20 00:00:00 CST 2017

    4.1.4 检查执行结果

    [root@znix ~]# ls /tmp/date/

    2017-05-01.txt  2017-05-05.txt  2017-05-09.txt  2017-05-13.txt  2017-05-17.txt

    2017-05-02.txt  2017-05-06.txt  2017-05-10.txt  2017-05-14.txt  2017-05-18.txt

    2017-05-03.txt  2017-05-07.txt  2017-05-11.txt  2017-05-15.txt  2017-05-19.txt

    2017-05-04.txt  2017-05-08.txt  2017-05-12.txt  2017-05-16.txt  2017-05-20.txt

    4.2 [实例]优化linux开机启动项目-for循环方法

    4.2.1 第一步:确定目标

    for name in 要关闭的服务的名字

    do

        chkconfig $name off

    done

    4.2.2 第二步:取出要关闭服务的名字

    [root@znix ~]# chkconfig |egrep -v "sshd|network|crond|rsyslog|sysstat"|awk '{print $1}'

    abrt-ccpp

    abrtd

    acpid

    ……

    4.2.3 第三步 把名字与for循环结合

    for name in `chkconfig |egrep -v "sshd|network|crond|rsyslog|sysstat"|awk '{print $1}'`

    do

        chkconfig $name off

    done

    第5章 脚本执行排错

    5.1 sh -x 显示脚本详细的执行过程

        前面有 +     表示执行过的命令的

        前面没有东西,表示输出到屏幕上的内容。

    [root@znix ~]# sh -x /server/scripts/cal2.sh

    + '[' 0 -ne 2 ']'

    + echo 'Usage: NUM1 NUM2'

    Usage: NUM1 NUM2

    + exit

    5.1.1 检查脚本运行中的错误

    [root@znix ~]# sh -x /server/scripts/cal2.sh  10 20

    + '[' 2 -ne 2 ']'

    + a=10

    + b=20

    + awk -vh=10 -vz=20 'BEGIN{print h/z}'

    0.5

    + awk -vh=10 -vz=20 'BEGIN{print h+z}'

    30

    + awk -vh=10 -vz=20 'BEGIN{print h-z}'

    -10

    + awk -vh=10 -vz=20 'BEGIN{print h*z}'

    200

    第6章 vim 快捷键

    ctrl + v    d批量删除

    ctrl + v    x批量删除

    dd        删除光标所在行

    dG       删除光标所在行到最后一行

    D        光标所在位置到行尾的内容

    x         删除光标所在位置的一个字符

    第7章 昨日回顾

    7.1 sed命令】删除文件中的空行或只有空格的行。

    7.1.1 文件内容

    [root@znix ~]# cat -A test.txt

    znix$

        $

    linux$

    $

    good$

      $

    n$

    7.1.2 * 表示前一个字符出现了0次或以上

    0次的时候即为^$ 表示空行,以上表示空格的行

    [root@znix ~]# sed '/^ *$/d' test.txt

    znix

    linux

    good

    n

    7.1.3 +表示连续出现至少一次

    [root@znix ~]# sed -r '/^ +$|^$/d' test.txt

    znix

    linux

    good

    n

    7.1.4 !表示取反

    [root@znix ~]# sed -n '/^ *$/!p' test.txt

    znix

    linux

    good

    n

    7.1.5 同样用来取反

    [root@znix ~]# sed -nr '/^$|^ +$/!p' test.txt

    znix

    linux

    good

    n

    7.2 shell编程中的变量

    7.2.1 特殊变量(shell脚本中)

    $1,$2...    用来传递参数

    $0        脚本文件的文件名

           $#        脚本中参数的个数

           $?        前一条命令是否执行成功

    7.2.2 全局变量(环境变量)

    常用的 LANG   PATH  PS1 ……

    7.2.3 普通变量

    自己定义的变量

    7.3 shell编程中与用户有关的环境变量的文件和目录

    /etc/profile

    /etc/profile.d    (目录)

    /etc/bashrc

    ~/.bashrc

    ~/.bash_profile

  • 相关阅读:
    【Python】python3.6中实现同一行动态输出
    【Python】将python3.6软件的py文件打包成exe程序
    【Java】分布式RPC通信框架Apache Thrift 使用总结
    【Java】加载驱动方法
    【Java】Comparable和Comparator接口的区别
    【Java】接口(interface)VS抽象类
    【Ubuntu】PHP环境安装-phpstudy for linux版
    【Ubuntu】xrdp完美实现Windows远程访问Ubuntu 16.04
    【系统设计】会议室预定系统房间预定系统设计
    jmeter场景设计:业务占比
  • 原文地址:https://www.cnblogs.com/langqi250/p/9711445.html
Copyright © 2011-2022 走看看