学习shell脚本入门
一、shell入门概述
1.1 概述
- Linux最经典的就是Shell,它是操作系统的最外层,它可以合并编程语言以控制进程和文件,以及启动和控制其他程序;
- shell通过提示您输入,向操作系统解释该输入,然后处理来自操作系统的任何结果输出来管理您与操作系统之间的交互。
- Shell是用户与Linux操作系统之间沟通的桥梁。用户可以输入命令执行,又可以利用Shell脚本编程去运行。
简单来说Shell就是一个用户跟操作系统之间的一个命令解释器;
1.2 Linux Shell的种类
- Linux Shell种类非常多,常见的有: Bourne Shell (/usr/bin/sh或/bin/sh)、Bourne Again Shell (/bin/bash) 、 C Shell(/usr/bin/csh)、K shell(/user/bin/ksh)、Shell for Root(/sbin/sh)等。不同的Shell语言的语法有所不同,所以不能交换使用。
1.3 创建我的第一个脚本 Hello,world
- 创建第一个脚本
vi first_shell.sh
- 对脚本编辑内容
#!/bin/bash
#Filename: first_shell.sh
#auto echo hello world!
#by authors zhang 2019
echo "Hello,world"
- 编辑完成后使用ESC退出插入模式,然后输入 ** : + wq ** 退出;
- 给予执行权限:
chmod o+x first_shell.sh
- 运行:
./first_shell.sh
使用此命令后,就会出现输出的Hello,world;同时我们也可以使用下方命令输出内容: /bin/bash first_shell.sh
脚本中,第一行的#!/bin/bash
内容是标注它是一个Shell脚本(固定格式),第二行表名名称,第三行是描述,第四行是作者和写脚本的日期,除了第一行是表明它是一个脚本外,其他行都是注释的内容;
执行脚本和执行命令是没有区别的,但是脚本里面可以包含很多条命令,而命令只能一次执行一次,效率较低;比如你同时要往十个服务器中部署一样的东西,那么脚本执行就可以省却大量的时间;
二、变量及LAMP导航菜单编写
2.1 变量的详解
- Shell编程语言是非类型的解释型语言,不像C++/JAVA语言编程时需要事先声明变量,SHELL给一个变量赋值,实际上就是定义了变量,在Linux支持的所有Shell中,都可以用赋值符号(=)为变量赋值,实际上就是定义了变量,在Linux支持的所有Shell中,都可以用赋值符号(=)为变量赋值。
- Shell变量可分为两类:局部变量和环境变量。局部变量只在创建它们的Shell脚本中使用。而环境变量则可以在创建它们的Shell及其派生出来的任意子进程中使用。有些变量时用户创建的,其他的则是专用Shell变量;
- 例如在脚本里面定义A=123,定义这样一个变量,前面是变量名,后面是变量的值。
- 引用变量可以使用$变量名;
2.2 变量实战示例
- 创建var.sh并编辑
vi var.sh
- 输入内容:
#!/bin/bash
#define path variables
#by authors anyu 2019
name=anyu
echo "My name is $name"
- 按ESC退出插入模式,再使用 WQ 进行保存退出;
- 运行:
sh var.sh
运行后显示结果: My name is anyu
这里的demo是一个局部变量
2.3 系统变量
- 系统变量: 它是系统已经为我们定义好了的变量,我们可以不用定义,直接使用即可
$0 当前程序的名称(当前脚本的名称)
$n 当前程序的第n个参数,n=1,2,3...9
$* 当前程序的所有参数(不包括程序本身)
$# 当前程序的参数个数(不包括程序本身)
$? 命令或程序执行完后的状态,一般返回0表示执行成功
$UID 当前用户的ID (结果为0的是Root用户)
$PWD 当前所在的目录
- $n代码示例:
echo $1 $2
- 执行命令:
sh var.sh param1 param2
- 显示结果:
param1 param2
从此可以看出,这里的n 代 码 的 是 在 执 行 命 令 的 后 面 的 参 数 位 数 , 是 第 几 位 参 数 则 可 以 用
n代码的是在执行命令的后面的参数位数,是第几位参数则可以用n代码的是在执行命令的后面的参数位数,是第几位参数则可以用n来进行表示;
在变量的定义中我们可以使用 变量名来转义,这样的话这个 变量名 来转义,这样的话这个 变量名来转义,这样的话这个就不代表引用变量了,下面代码示例
- 示例$1,2 , 2,2,?,∗ , *,∗,#的作用
echo "The \$1 is $1"
echo "The \$2 is $2"
echo "The \$? is $?"
echo "The \$* is $*"
echo "The \$# is $#"
- 执行命令:
sh var.sh abc edf
- 显示结果:
The \$1 is abc
The \$2 is edf
The \$? is 0
The \$* is abc edf
The \$# is 2
1 为输入的第一个参数, 2 为执行命令的第二个参数, 2 为执行命令的第二个参数, 2 为执行命令的第二个参数, ? 为判断上一条命令是否执行成功,若执行成功则返回 0 , 1为输入的第一个参数,2 为 执 行 命 令 的 第 二 个 参 数 , 2为执行命令的第二个参数,2为执行命令的第二个参数,?为判断上一条命令是否执行成功,若执行成功则返回0, 1为输入的第一个参数,2为执行命令的第二个参数,2为执行命令的第二个参数,2为执行命令的第二个参数,?为判断上一条命令是否执行成功,若执行成功则返回0,*表示所有参数 KaTeX
parse error: Expected ‘EOF’, got ‘#’ at position 1: #̲统计参数个数
在编译apach…?在判断上一条命令是否执行成功
2.4 自定义菜单
- 创建并编辑:
vi var1.sh
- 编辑内容如下:
#!/bin/bash
#auto print variables
# by anyu 2019-07
echo -e "\033[32mPlease select Menu follow:\033[1m"
echo "1)安装apache服务器."
echo "2)安装Mysql服务器."
echo "3)安装PHP服务器."
echo "4)安装LAMP WEB架构"
echo "--------------------------------------------"
- 显示结果如下:
三、shell编程之If条件语句
3.1 if条件判断语句
- 语句句式如下:
if (表达式)
语句1
else
语句2
fi
fi作为if条件语句的结尾
3.2 测试数字大小的if条件判断案例
- 创建并编辑
vi if.sh
- 内容如下:
#!/bin/bash
# auto if test
# by anyu 2019
NUM1=100
NUM2=200
if(($NUM1> $NUM2));then
echo "This $NUM1 greate $NUM2 !"
else
echo "This $Num1 little $num2 !"
fi
- ESC保存WQ退出,执行下面命令:
/bin/bash/ if.sh
两个小括号在if语句中是用来判断大小的;
- 结果如下:
This 100 little 200 !
3.3 逻辑运算符解析
-f 判断文件是否存在 例如: if[-f filename]
-d 判断目录是否存在 例如: if[-d dir]
-eq 等于 应用于:整型比较
-ne 不等于 应用于:整型比较
-lt 小于 应用于:整型比较
-gt 大于 应用于:整型比较
-le 小于或等于 应用于:整型比较
-ge 大于或等于 应用于:整型比较
-a 双方都成立(and) 逻辑表达式 -a 逻辑表达式
-o 单方成立(or) 逻辑表达式 -o 逻辑表达式
-z 空字符串
3.4 判断文件夹是否存在的脚本案例
- 创建并编辑
vi if2.sh
- 内容如下:
#auto test files
#by authors anyu 2019
FILES=/tmp/test.txt
if [ ! -f $FILES ];then
echo "OK" >> $FILES
else
echo -e "\033[32m---------------\033[1m"
cat $FILES
fi
这个是用来判断文件夹test.txt是否存在,如果存在则打印OK,如果不存在则创建并浏览;
- 使用命令执行:
/bin/bash if2.sh
3.5 IF条件语句之得分案例
- 创建并编辑
vi scores.sh
- 编辑内容如下:
#!/bin/bash
#by anyu 2019
scores=$1
if [ -z $scores ]; then
echo "usage: {$0 60|80.}"
exit
if
if [[ $scores -gt 85 ]]; then
echo "very good!";
elif [[ $scores -gt 75 ]]; then
echo "good!";
elif [[ $scores -gt 60 ]]; then
echo "pass!";
else
echo "no pass!"
fi
- 输入下方命令执行:
/bin/bash scores.sh
- 显示:usage: {scores.sh 60|80.},说明不能为空;
- 输入: /bin/bash scores.sh 60 ->显示: no pass!
- 输入: /bin/bash scores.sh 61 ->显示: pass!
- 输入: /bin/bash scores.sh 100 ->显示: very good!
说明这个脚本是能够根据输入进入的分数进行判断是否合格,并给予分数对应的评价;
3.6 使用if条件语句编写MySQL备份脚本
- 创建并编辑:
vi auto_backup_mysql.sh
- 内容如下:
#!/bin/bash
#auto bakcup mysql db
#by authors anyu 2019
#define backup path
BAK_DIR=/data/backup/`date +%Y%m%d`
MYSQLDB=discuz # 数据库名
MYSQLUSR=root # 用户名
MYSQLPW=123456 # 密码
MYSQLCMD=/usr/bin/mysqldump
if [ $UID -ne 0 ];then
echo "Must to be use root for exec shell" # 必须使用Root用户登录
exit
fi
if [ ! -d $BAK_DIR ];then
mkdir -p $BAK_DIR
echo -e "\033[32mThe $BAK_DIR Create Successfully!"
else
echo "This $BAK_DIR is exists..."
fi
$MYSQLCMD -u$MYSQLUSR -p$MYSQLPW -d $MYSQLDB >$BAK_DIR/$MYSQLDB.sql
if [ $? -eq 0 ];then # 判断是否执行成功
echo -e "\033[32mThe Mysql Backup $MYSQLDB Successfully!\033[0m"
else
echo -e "\033[32mThe Mysql Backup $MYSQLDB Failed,Please check.\033[0m"
fi
- 执行脚本:
sh -n auto_backup_mysql.sh
/bin/sh auto_backup_mysql.sh
- 加每天定时运行命令(定时任务):
crontab -e
- 增加的内容如下
0 0 * * * /bin/bash /data/shell/auto_backup_mysql.sh >>/tmp/mysql_bak.log
加入定时任务后,会按照时间表达式定时执行,如果已经备份过则无需再次备份,脚本内的if语句会自行判断;
`` 这个反引号会被解析为命令,而单引号不会被解析;