一、创建一个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 字符串的长度为零则为真
② if 案例
-n 字符串的长度不为零则为真if 可以用 [ ] 进行判断,也可以使用 test 来判断
#!/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多分支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 $SUMdo 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



