Shell脚本

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

运行脚本的方式

[[email protected] ~]# cat print.sh 
#!/bin/bash

echo "Hello World!"
exit 0
  • 分为3种:

1.赋予权限,直接运行

[[email protected] ~]# chmod a+x print.sh 
[[email protected] ~]# ./print.sh 
Hello World!

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

[[email protected] ~]# bash print.sh 
Hello World!
[[email protected] ~]# sh print.sh 
Hello World!

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

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

判断语句应用

if语句

格式语法1:

if 条件
then
命令序列
fi
  • 判断当前用户为root
[[email protected] ~]# cat user.sh 
#!/bin/bash
if [ "$(id -u)" -eq "0" ];
then
echo "You are root!"
fi

格式语法2:

if 条件
then
命令序列
else
命令序列
fi
  • 一个简单的判定:
[[email protected] ~]# cat user.sh 
#!/bin/bash
read -p "Input you password:" password
if [ "$password" == "123456" ];
then
echo "password OK"
else
echo "password ERROR"
fi
  • 运行结果
[[email protected] ~]# ./user.sh 
Input you password:123456
password OK
[[email protected] ~]# ./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。
[[email protected] ~]# 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
  • 运行结果
[[email protected] ~]# ./num.sh 
Please input a number:85
great
[[email protected] ~]# ./num.sh 
Please input a number:75
good
[[email protected] ~]# ./num.sh 
Please input a number:65
pass
[[email protected] ~]# ./num.sh 
Please input a number:55
fail

case语句

语法格式1:

case $变量名称 in
模式1)
  命令序列
  ;;
模式2)
  命令序列
  ;;
模式N)
  命令序列
  ;;
*)
esac
示例1
  • 周三周五备份日志
[[email protected] ~]# 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
  • 运行结果
[[email protected] ~]# ./backup.sh 
OK
[[email protected] ~]# ls ~ | grep log
20+04+03_log_tar.gz
示例2
  • 判断输入字符为数字还是字母
[[email protected] ~]# 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
  • 运行结果
[[email protected] ~]# ./nw.sh 
Input a number or word:5
This is a number.
[[email protected] ~]# ./nw.sh 
Input a number or word:a
This is a character.
[[email protected] ~]# ./nw.sh 
Input a number or word:@
Error