简单来说Shell就是一个用户跟操作系统之间的一个命令解释器;
vi first_shell.sh
#!/bin/bash
#Filename: first_shell.sh
#auto echo hello world!
#by authors zhang 2019
echo "Hello,world"
chmod o+x first_shell.sh
./first_shell.sh
使用此命令后,就会出现输出的Hello,world;同时我们也可以使用下方命令输出内容:
/bin/bash first_shell.sh
脚本中,第一行的#!/bin/bash
内容是标注它是一个Shell脚本(固定格式),第二行表名名称,第三行是描述,第四行是作者和写脚本的日期,除了第一行是表明它是一个脚本外,其他行都是注释的内容;
执行脚本和执行命令是没有区别的,但是脚本里面可以包含很多条命令,而命令只能一次执行一次,效率较低;比如你同时要往十个服务器中部署一样的东西,那么脚本执行就可以省却大量的时间;
vi var.sh
#!/bin/bash
#define path variables
#by authors anyu 2019
name=anyu
echo "My name is $name"
sh var.sh
运行后显示结果: My name is anyu
这里的demo是一个局部变量
$0 当前程序的名称(当前脚本的名称)
$n 当前程序的第n个参数,n=1,2,3...9
$* 当前程序的所有参数(不包括程序本身)
$# 当前程序的参数个数(不包括程序本身)
$? 命令或程序执行完后的状态,一般返回0表示执行成功
$UID 当前用户的ID (结果为0的是Root用户)
$PWD 当前所在的目录
echo $1 $2
-执行命令:
sh var.sh param1 param2
param1 param2
从此可以看出,这里的 n 代 码 的 是 在 执 行 命 令 的 后 面 的 参 数 位 数 , 是 第 几 位 参 数 则 可 以 用 n代码的是在执行命令的后面的参数位数,是第几位参数则可以用 n代码的是在执行命令的后面的参数位数,是第几位参数则可以用n来进行表示;
在变量的定义中我们可以使用 $变量名 来转义,这样的话这个$就不代表引用变量了,下面代码示例
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,$*表示所有参数 KaTeX parse error: Expected 'EOF', got '#' at position 1: #̲统计参数个数 在编译apach…?在判断上一条命令是否执行成功
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 "--------------------------------------------"
if (表达式)
语句1
else
语句2
fi
fi作为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
/bin/bash/ if.sh
两个小括号在if语句中是用来判断大小的;
This 100 little 200 !
-f 判断文件是否存在 例如: if[-f filename]
-d 判断目录是否存在 例如: if[-d dir]
-eq 等于 应用于:整型比较
-ne 不等于 应用于:整型比较
-lt 小于 应用于:整型比较
-gt 大于 应用于:整型比较
-le 小于或等于 应用于:整型比较
-ge 大于或等于 应用于:整型比较
-a 双方都成立(and) 逻辑表达式 -a 逻辑表达式
-o 单方成立(or) 逻辑表达式 -o 逻辑表达式
-z 空字符串
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
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
说明这个脚本是能够根据输入进入的分数进行判断是否合格,并给予分数对应的评价;
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语句会自行判断;
> `` 这个反引号会被解析为命令,而单引号不会被解析;