这篇文章上次修改于 1480 天前,可能其部分内容已经发生变化,如有疑问可询问作者。

Shell脚本

  • 脚本不是命令的堆积,脚本中还包含变量设置、控制与循环、逻辑运算等。
  • 脚本的执行效率比C++之类的编程语言低,比一些高级编程语言执行效率高。

    运行脚本的方式

    [root@Hyui-VM ~]# cat print.sh 
    #!/bin/bash
    
    echo "Hello World!"
    exit 0
  • 分为3种:

    1.赋予权限,直接运行

    [root@Hyui-VM ~]# chmod a+x print.sh 
    [root@Hyui-VM ~]# ./print.sh 
    Hello World!

    2.没有权限,通过bash和sh运行

    [root@Hyui-VM ~]# bash print.sh 
    Hello World!
    [root@Hyui-VM ~]# sh print.sh 
    Hello World!

    3.没有权限,通过.或source运行

    [root@Hyui-VM ~]# . print.sh 
    Hello World!
    [root@Hyui-VM ~]# source print.sh 
    Hello World!
  • 执行方式不同之处在于:第一种方法是赋予脚本权限后在当前Shell下开启一个子进程用于运行脚本;第二种方法通过bash和sh执行,执行时不会关心#!后的解释器;第三种方法使用.和source执行会直接在当前Shell环境执行。

    判断语句应用

    if语句

    格式语法1:

    if 条件
    then
    命令序列
    fi
  • 判断当前用户为root

    [root@Hyui-VM ~]# cat user.sh 
    #!/bin/bash
    if [ "$(id -u)" -eq "0" ];
    then
    echo "You are root!"
    fi

    格式语法2:

    if 条件
    then
    命令序列
    else
    命令序列
    fi
  • 一个简单的判定:

    [root@Hyui-VM ~]# cat user.sh 
    #!/bin/bash
    read -p "Input you password:" password
    if [ "$password" == "123456" ];
    then
    echo "password OK"
    else
    echo "password ERROR"
    fi
  • 运行结果

    [root@Hyui-VM ~]# ./user.sh 
    Input you password:123456
    password OK
    [root@Hyui-VM ~]# ./user.sh 
    Input you password:654321
    password ERROR

    格式语法3:

    if 条件
    then
    命令序列
    elif 条件
    then
    命令序列
    elif 条件
    then 
    命令序列
    else
    命令序列
    fi
  • 输入一个数字,如果大于80,输出great;大于70但小于80,输出good;大于60小于70,输出pass;小于60,输出fail。

    [root@Hyui-VM ~]# cat num.sh 
    #!/bin/bash
    read -p "Please input a number:" num
    if [ "$num" -ge 80 ];
    then
    echo "great"
    elif [ "$num" -ge 70 ];
    then
    echo "good"
    elif [ "$num" -ge 60 ];
    then
    echo "pass"
    else
    echo "fail"
    fi
  • 运行结果

    [root@Hyui-VM ~]# ./num.sh 
    Please input a number:85
    great
    [root@Hyui-VM ~]# ./num.sh 
    Please input a number:75
    good
    [root@Hyui-VM ~]# ./num.sh 
    Please input a number:65
    pass
    [root@Hyui-VM ~]# ./num.sh 
    Please input a number:55
    fail

    case语句

    语法格式1:

    case $变量名称 in
    模式1)
    命令序列
    ;;
    模式2)
    命令序列
    ;;
    模式N)
    命令序列
    ;;
    *)
    esac
    示例1
  • 周三周五备份日志

    [root@Hyui-VM ~]# cat backup.sh 
    #!/bin/bash
    DATE=$(date +%a)
    TIME=$(date +%y+%m+%d)
    case $DATE in
          Wed|Fri)
    tar -czf /root/${TIME}_log_tar.gz /var/log&>/dev/null
    echo "OK"
    ;;
          *)
    echo "Today is ${DATE}"
    esac
  • 运行结果

    [root@Hyui-VM ~]# ./backup.sh 
    OK
    [root@Hyui-VM ~]# ls ~ | grep log
    20+04+03_log_tar.gz
    示例2
  • 判断输入字符为数字还是字母

    [root@Hyui-VM ~]# cat nw.sh 
    #!/bin/bash
    read -p "Input a number or word:" nw
    case $nw in 
          [a-z]|[A-Z])
    echo "This is a character."
    ;;
          [[:digit:]])
    echo "This is a number."
    ;;
          *)
    echo "Error"
    esac
  • 运行结果

    [root@Hyui-VM ~]# ./nw.sh 
    Input a number or word:5
    This is a number.
    [root@Hyui-VM ~]# ./nw.sh 
    Input a number or word:a
    This is a character.
    [root@Hyui-VM ~]# ./nw.sh 
    Input a number or word:@
    Error