一、创建一个hello.sh
#!/bin/bash
echo "hello world"
① 注意 #!/bin/bash
shell脚本以 #!/bin/bash 开头,表示我们的shell为bash shell
② 脚本需要可执行权限
[root@master-129 myshell]# chmod +x hello.sh
[root@master-129 myshell]# ll
总用量 4
-rwxr-xr-x. 1 root root 32 5月 28 17:33 hello.sh
[root@master-129 myshell]# ./hello.sh
hello world
添加可执行权限后,执行 ./hello.sh
③ 如果没有执行权限 可以使用sh命令也是可以的
[root@master-129 myshell]# sh hello.sh
hello world
二、变量
#!/bin/bash
#定义一个变量A
A=100 ##注意这里不需要加$符号, "="等号两边不能加空格
echo $A ###输出需要加$
echo A=$A ##没有加引号也表示字符串,遇到$符号就表示是变量
echo "A=$A" ##也是可以的 表示在字符串中
#销毁变量
unset A ##不用加$符号
echo $A ##如果变量被销毁,输出为空
##定义一个静态变量
readonly B=2 ##静态变量不能被销毁
echo $B
## `` 和 $() 表示中间的字符串以命令执行后结果输出
C=date
D=`date`
F=$(date)
echo $C
echo $D
echo $F
①定义变量的规则
1、由字母、数字、下划线组成,不能以数字开头
2、等号两侧不能空格
3、变量名一般习惯为大写,这是一个规范
② 将命令的返回值赋值给变量
A=`date`
A=$(date)
③ 全局变量
1、在/etc/profile最后面添加
export PHP_HOME=/usr/local/php
上面的PHP_HOME就是全局变量
2、必须要用 source /etc/profile 才能生效
④多行注释
:<<!
多行注释的内容
!
⑤ 命令传参变量
我们执行shell脚本时,可以在后面添加参数,然后脚本拿到参数变量
#!/bin/bash
echo "$0 $1 $2 $3" ## $0表示命令本身 $1变量1 $2变量2 $3变量3
echo $* ##输出所有的传量参数
echo $@ ##输出所有的传量参数
echo $# ##变量的个数
执行上面的脚本
[root@master-129 myshell]# sh position.sh 100 200 300
position.sh 100 200 300
100 200 300
100 200 300
3
三、运算符
有三种写法,推荐使用第二种,最重要的是语法跟编程语言不一样,例如java、php等,都是直接相加,而shell需要 $[a+b] 有一个运算写法
① #第一种 $((运算式))
#计算 (2+3) * 4
#第一种 $((运算式))
R1=$(((2+3)*4))
echo $R1
② 第二种 $[运算式] 推荐使用这种 比较直观
R2=$[(2+3)*4]
echo $R2
③ #第三种 expr
#第三种 expr
TEMP=`expr 2 + 3` ##运算式中间必须有 空格
R3=`expr $TEMP \* 4` ## *乘以 必须是 \*
echo $TEMP
echo $R3
四、条件判断
① 判断条件
1) 字符串的比较使用 "=", 这个跟我们常规的编程语言不一样
2) 两个整数的比较
-lt 小于
-le 小于等于
-eq 等于
-gt 大于
-ge 大于等于
-ne 不等于
3)按照文件的权限进行判断
-r 有读的权限
-w 有写的权限
-x 有执行的权限
4) 按照文件的类型判断
-f 文件存在并且是一个常规的文件
-e 文件存在
-d 文件存在且是一个目录
4) 字符串
-z 字符串的长度为零则为真
-n 字符串的长度不为零则为真
② if 案例
if 可以用 [ ] 进行判断,也可以使用 tethst 来判断
#!/bin/bash
## 判断ok 是否等于 ok
if [ "ok" = "ok" ] ##判断的这里 if后面必须空格 [中间也需要空格]
then
echo "equel"
fi
## 判断23是否大于等于22
if [ 23 -ge 22 ]
then
echo "23大于22"
fi
## 判断/root/1.sql是否存在
if [ -f /root/1.sql ]
then
echo "文件存在"
fi
解析:if 这块的then不能直接写在 if [] 后面,像if [] then这样语法是不通过的
③ if多分支
if elif else fi 格式
#!/bin/bash
if [ $1 -lt 60 ]
then
echo "小于60"
elif [ $1 -gt 60 ]
then
echo "大于60"
if [ $1 -gt 90 ]
then
echo "$1大于90"
fi
else
echo "等于60"
fi
④ case语句
#!/bin/case
case $1 in
"1")
echo "周一"
;;
"2")
echo "周二"
;;
*)
echo "other"
;;
esac
使用的是 "1") 代码 ;; 组合判断的
五、循环
① 循环1到100
#!/bin/bash
## 循环100的值相加
SUM=0
for (( i=0; i<=100; i++))
do
SUM=$[$SUM+$i]
done
echo $SUM
do done中的左边的SUM不需要带$符号
② 循环取出 $@ 的数据
$@表示命令行后面参数
for i in $@
do
echo "num is $i"
done
③ while 循环
$1表示命令行后面的参数 -le小于的意思
#!/bin/bash
SUM=0
i=0
while [ $i -le $1 ]
do
SUM=$[$SUM+$i]
i=$[$i+1]
done
echo $SUM
④ 案例 九九乘法表
#!/bin/bash
for ((i = 1; i < 10; i++))
do
for ((j = 1; j < 10; j++))
do
n=$[ $i * $j ]
#echo $n
echo -n $i*$j=$n" "
if [ $j -eq $i ]
then
break
fi
done
echo ""
done
运行结果
六、read 读取控制台输入的内容
#!/bin/bash
#读取控制器输入的num1值
read -p "请输入一个数字" NUM1
echo "您输入的是$NUM1"
#读取控制台的数字 10s内输入
read -t 10 -p "请输入一个数字" NUM2
echo "您输入的$NUM2"
七、系统函数
[root@master-129 myshell]# dirname /root/1.txt
/root
[root@master-129 myshell]# basename /root/1.txt
1.txt
八、自定义函数
#!/bin/bash
##定义一个函数
function getSum() {
SUM=$[ $m + $n ] ##这里的m和n变量名跟前面调用的要一样
echo $SUM
}
read -p "请输入一个数字" n
read -p "请输入一个数组" m
getSum $n $m ##调用函数
九、shell案例,备份数据库
① 编写shell
#!/bin/bash
## 每天凌晨2::30 备份mysql数据库 到/data/backup/db/
## 备份开始和备份能够给出相应的提示信息
## 备份文件名 2021-03-12_120210.tar.gz
## 备份的同时,检查是否有前10天的备份文件,如果有则删除
back_dir=/data/backup/db/
mysql_host=127.0.0.1
mysql_user=root
mysql_pwd=123456
mysql_db_name=test2
now_date=$(date +%Y-%m-%d_%H%M%S)
now_date_path="$back_dir$now_date"
backup_db_name="$now_date_path/$now_date.sql"
backup_db_tar_file="$back_dir$now_date.tar.gz"
#echo $now_date_path
## 1、创建路径
if [ ! -d $now_date_path ]
then
mkdir -p $now_date_path
echo "创建目录成功"
fi
## 2、导出mysql命令
mysqldump --single-transaction -h$mysql_host -u$mysql_user -p$mysql_pwd -B $mysql_db_name > $backup_db_name
#echo "保存的路径=$backup_db_name"
## 3、进行打包
echo $now_date_path
## 这块不能直接tar保存路径,不然tar把路径也保存了 所以需要使用cd
##tar -czvf $backup_db_tar_file $now_date_path
cd $back_dir
tar -czvf $backup_db_tar_file $now_date
## 4、删除路径
rm -fr $now_date_path
## 5、删除10天前的备份文件
find $back_dir -atime +10 -name "*.tar.gz" -exec rm {} \;
② 定时
[root@master-129 myshell]# crontab -l
30 2 * * * sh /root/myshell/mysql_back.sh
本文详细介绍了Shell脚本的基础知识,包括脚本创建与执行、变量定义与使用、条件判断与循环控制等内容,并通过实例演示如何实现数据库备份等实用功能。
316

被折叠的 条评论
为什么被折叠?



