一、Hello World 示例


注:脚本通常以 #!/bin/bash 开头,表示使用 /bin/bash 来解释执行脚本;#! 告诉系统,后面的路径指定的是解释该脚本的 Shell 程序。
二、变量
Shell 中的变量可以分为两类:系统变量和用户自定义变量。
- 系统变量:由操作系统内置,例如
$HOME、$PATH、$USER。 - 用户自定义变量:由脚本编写者自己定义。
可以使用 set 命令查看当前环境中的所有系统变量。
1. 变量定义
定义规则如下:
1 2 3 4
| 1) 变量名可以由字母、数字和下划线组成,但不能以数字开头。 2) 等号两侧不能有空格。 3) 不能使用标点符号。 4) 不能使用 Shell 的关键字(可使用 help 命令查看保留关键字)。
|
变量使用示例如下:


2. 将命令返回内容赋值给变量
1 2 3 4 5
| date=`date`
date=$(date)
|
两种方式都可以把命令结果赋值给变量,推荐使用 $(),可读性和嵌套能力更好。


3. 位置参数变量
执行命令时通常会带参数,同样,执行 Shell 脚本时也可以传入参数。如果想在脚本中获取执行脚本时输入的参数信息,可以使用位置参数变量。例如:
在 localvar.sh 中可以获取到 6 和 7。常见位置参数如下:


4. 预定义变量
Shell 内置了一些预定义变量,类似环境变量,但不同的是,环境变量可以被重新定义,而预定义变量通常不能由程序员重新赋值。


三、运算符
1. $((运算式)) 或 $[运算式]
这是 Shell 中最常用的算术运算方式。

2. expr 运算
1 2 3 4 5
| expr 1 + 1 expr 10 - 2 expr 3 \* 2 expr 10 / 3 expr 10 % 3
|
其中 * 需要转义,否则会被 Shell 当作通配符。

四、条件判断
Shell 中条件判断的基本语法为:
注意:[ 与 condition 之间,以及 condition 与 ] 之间都要有空格。
- 条件非空返回
true。 - 可用
$? 验证命令返回值:0 表示成功/真,非 0 表示失败/假。
1. 数字比较
1 2 3 4 5 6 7
| = -lt -le -eq -gt -ge -ne
|

2. 字符串比较
1 2 3 4
| -z 字符串 -n 字符串 字符串1 == 字符串2 字符串1 != 字符串2
|
3. 按照文件权限判断
1 2 3 4 5 6
| -r 文件 -w 文件 -x 文件 -u 文件 -g 文件 -k 文件
|
4. 按照文件类型进行判断
1 2 3 4 5 6 7 8 9 10
| -f 文件 -e 文件 -d 文件
-L 文件 -p 文件 -s 文件 -S 文件
|
5. 两个文件之间的比较
1 2 3
| 文件1 -nt 文件2 文件1 -ot 文件2 文件1 -ef 文件2
|
6. 多重判断
1 2 3
| 判断1 -a 判断2 判断1 -o 判断2 ! 判断
|
五、流程控制
1. if 语句
1 2 3 4 5 6 7
| if [ 条件判断式 ] then 程序 elif [ 条件判断式 ] then 程序 fi
|

2. case 语句
1 2 3 4 5 6 7 8 9 10 11
| case $变量名 in "值 1") 执行程序 1 ;; "值 2") 执行程序 2 ;; *) 执行默认程序 ;; esac
|

3. for 语句
1 2 3 4 5 6 7 8 9 10 11
| for 变量 in 值1 值2 值3... do 程序 done
for (( 初始值; 循环控制条件; 变量变化 )) do 程序 done
|

$* 与 $@ 的区别如下图:

4. while 语句
1 2 3 4
| while [ 条件判断式 ] do 程序 done
|

六、read 获取控制台输入
参数说明:
-p:读取输入时显示提示信息。-t:设置等待时间,超时后不再等待并继续执行。
示例:
1
| read -p "请输入用户名:" username
|

七、Shell 脚本函数
1. 系统函数
系统函数由 Shell 提供,常用的有 basename 和 dirname。
1 2 3 4 5
| basename [文件路径] [suffix]
dirname 文件绝对路径
|

2. 自定义函数
1 2 3 4
| function funname(){ Action; [return int;] }
|



$10 不能获取第十个参数,若想获取第十个参数,需要使用 ${10}。当 n >= 10 时,也需要使用 ${n} 来获取参数。
其他常用参数:
1 2 3 4 5 6 7
| $# $* $$ $! $@ $- $?
|
注意:所有函数使用前都必须先定义。这意味着函数必须出现在脚本中能够被解析到的位置,解释器首次发现函数之前不能调用它。调用函数时只需要使用函数名即可。
八、MySQL 备份脚本
以备份本博客的全部数据为例:
1. 编写脚本文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| #!/bin/bash
BACK_UP_DIR=/opt/deploy/myblog
DATE_TIME=$(date +%Y%m%d_%H%M%S)
echo '----------开始备份----------' echo "----备份路径为: $BACK_UP_DIR/$DATE_TIME.tar.gz---------"
HOST=localhost USER=**** PASSWD=**** DATABASE=****
[ ! -d $BACK_UP_DIR ] && mkdir -p "$BACK_UP_DIR"
mysqldump -u${USER} -p${PASSWD} --host=$HOST $DATABASE > $BACK_UP_DIR/$DATE_TIME.sql
cd /opt/deploy/ tar -zcvf $DATE_TIME.tar.gz myblog/ upload/
mv $DATE_TIME.tar.gz /root/myblogbackup/
rm -rf /opt/deploy/myblog
find /root/myblogbackup -mtime +7 -name "*.tar.gz" -exec rm -rf {} \;
echo "-------------备份文件成功--------------"
|

2. 添加定时任务,每天执行一次
1 2 3
| crontab -e
0 0 * * * /***/***/myblogbackup.sh
|
