赞
踩
一、创建一个hello.sh
- #!/bin/bash
- echo "hello world"
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
- [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
- 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 可以用 [ ] 进行判断,也可以使用 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 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
- #!/bin/case
- case $1 in
- "1")
- echo "周一"
- ;;
- "2")
- echo "周二"
- ;;
- *)
- echo "other"
- ;;
- esac
使用的是 "1") 代码 ;; 组合判断的
五、循环
- #!/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
$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案例,备份数据库
- #!/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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。