Linux-12.1

基本语法:

$n  #n为数字,$0代表命令本身,$1-$9代表第一到第九个参数,十以上的参数需要用大括号包含,如{10}
$*  #这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体
$@  #这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待
$#  #这个变量代表命令行中所有参数的个数
#实例:写一个脚本  打印出传递进去的11个参数及详细
#!/bin/bash
echo "param[0] ----  $0"
echo "param[1] ----  $1"
echo "param[2] ----  $2"
echo "param[3] ----  $3"
echo "param[4] ----  $4"
echo "param[5] ----  $5"
echo "param[6] ----  $6"
echo "param[7] ----  $7"
echo "param[8] ----  $8"
echo "param[9] ----  $9"
echo "param[10] ----  ${10}"
echo "param[11] ----  ${11}"

echo "param count is $#"
echo "param  -----------  $@"
echo "param  ===========  $*"

在这里插入图片描述
预定义变量:
就是shell设计者实现一键定义好的变量,可以直接在shell脚本中使用

$$   #当前进程的进程号(PID)
$!   #当前运行的最后一个进程的进程号(PID)
$?   #最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。

应用实例:在一个shell脚本中简单使用一下预定义变量

#!/bin/bash
echo "当前进程的进程号 = $$"
#后台的方式运行tomcat.sh
./tomcat.sh &   #后台运行

echo "当前运行的最后一个进程的进程号 = $!"
echo "最后一次执行的命令的返回状态 = $?"

在这里插入图片描述
!!!:./tomcat.sh & #后台运行 这一句没懂

运算符:

$((运算式))
#或
$[运算式]
expr m + n   #加
expr m - n	 #减
expr \*		 #乘
expr /		 #除
expr %		 #取余

实例一:

#!/bin/bash
M=100
N=5

echo "M + N = $((M + N))"

echo "M - N = $[M - N]"
MN1=`expr $M \* $N`
echo "M * N = $MN1"

C=`expr $M / $N`
echo "M / N = $C"

D=`expr $M % $N`
echo "M % N = $D"

$[运算式] 不太行!(我自己的系统下跑不出来!)
在这里插入图片描述

在单独进行计算的时候需要使用expr,在表达式里面直接进行计算的时候就不需要,如下:
在这里插入图片描述
案例二:求出命令行输入两个参数的和

#!/bin/bash
A=$1
B=$2
SUM=$[A+B]
echo "sum = $SUM"

在这里插入图片描述
条件判断:

[ condition ]    #非空返回true   可使用$?严重(0位true,>1为false)   注意:condition前后要有空格

常用判断条件
两个整数的比较:
在这里插入图片描述
按照文件权限进行判断:
在这里插入图片描述
按照文件类型进行判断:
在这里插入图片描述

##判断 "ok"和"ok"是否相等
#!/bin/bash
if [ "ok" = "ok" ]
then
        echo "equal"
fi

##23是否大于22
if [ 23 -gt 22 ]
then
        echo "大于"
fi

##判断文件是否存在
if [ -e /home/shell/aaa.txt ]
then
		echo "存在"
fi

流程控制:
if:

if [ 条件判断式 ];then
    程序
fi

###或者

if [ 条件判断式 ]
then
    程序
elif [ 条件判断式 ]
then
    程序
fi
#编写sh脚本  输入参数,参数>=60,打印"及格了",参数<60,打印"不及格"
#!/bin/bash
if [ $1 -ge 60 ]
then
        echo "及格了"
elif [ $1 -lt 60 ]
then
        echo "不及格"
fi

case:

case $变量名 in
"值1")
程序1
;;
"值2")
程序2
;;
..........
"值n")
程序n
;;
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac
#实例

#!/bin/bash
case $1 in
        1)
                echo "一"
                ;;
        2)      
                echo "二"
                ;;
        3)      
                echo "三"
                ;;
        *)      
                echo "其他"
                ;;
esac 

for循环:

#语法一
for 变量 in 值1 值2 ... 值n
do
 程序
done

#实例:打印命令行输入的参数  $* $@
#!/bin/bash
for i in "$*"
do
		echo "the num is $i"
done

echo "-------------------------"

for j in "$@"
do
		echo "the num is $j"
done
#语法二
for((初始值;循环控制条件;变量变化))
do
	程序
done

#实例:从1加到100并输出结果
#!/bin/bash
SUM=0
for((i=1;i<=100;i++))
do
	SUM=$[$SUM+$i]
done
echo "最终结果是:$SUM"

while循环:

while [ 条件判断式 ]
do
	程序
done

#案例:从命令行输入一个n,统计从1+...+n的值是多少
#!/bin/bash
SUM=0
i=0
while [ $i -le $1 ]
do
		SUM=$[$SUM+$i]
		i=$[$i+1]
done
echo "sum = $SUM"

read读取控制台输入:

read 选项 参数
#-p 指定读取值时的提示符(阻塞)
#-t 指定读取值时等待的时间(秒),如果没有在指定的时间内输入,就不再等待了
#案例1:读取控制台输入一个num值
#!/bin/bash
read -p "请输入一个数:" NUM1
echo "你输入的值是:$NUM1"

#案例2:读取控制台输入一个num值,在10秒内输入。
#!/bin/bash
read -t 10 -p "请输入一个数:" NUM1
echo "你输入的值是:$NUM1"

函数:
系统函数:

basename [pathname] [suffix]  #返回完整路径最后/的部分,常用于获取文件名
#basename命令会删掉所有的前缀包括最后一个("/")字符,然后将字符串显示出来

#案例:请返回/home/shell/hello.sh的"hello.sh"部分
basename /home/shell/hello.sh
#shell脚本中:  echo `basename /home/shell/hello.sh`

#案例:请返回/home/shell/hello.sh的"hello"部分
basename /home/shell/hello.sh .sh
#shell脚本中:  echo `basename /home/shell/hello.sh .sh`
dirname 文件绝对路径 
#返回完整路径最后/的前面的部分,常用于返回路径部分
#从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分)

#实例:请返回/home/shell/hello.sh的/home/shell
dirname /home/shell/hello.sh
#shell脚本中:  echo `dirname /home/shell/hello.sh`

自定义函数:

function funname()
{
    Action;
    [return int;]
}

#应用实例:编写一个函数,计算两个参数的和,getSum
function getSum()
{
    SUM=$[$n1+$n2]
    echo "和是:$SUM"
}
read -p "请输入第一个数 n1:" n1
read -p "请输入第二个数 n2:" n2

getSum $n1 $n2

Shell编程综合案例:
需求:

  • 每天凌晨2:10备份数据库 kugou 到 /home/mysql/data/db
  • 备份开始和备份结束能够给出相应的提示信息
  • 备份后的文件要求以备份时间为文件名,并打包成.tar.gz的形式,比如:2019-6-15_222222.tar.gz
  • 在备份的同时,检查是否有10天前备份的数据库文件,如果有就将其删除。

实现:

#!/bin/bash
#完成数据库的定时备份

echo "=========开始备份=========="

#备份的路径
BACKUP=/home/mysql/data/db          
echo "备份的路径:${BACKUP}"

#获取到当前的时间
DATETIME=$(date +%Y-%m-%d_%H%M%S)  
echo "当前时间:${DATETIME}"

#主机
HOST=localhost
echo "主机:${HOST}"

#用户名
DB_USER=yxh_mysql
echo "用户名:${DB_USER}"

#密码
DB_PWD=a
echo "密码:${DB_PWD}"

#备份数据库名
DATABASE=shelltest
echo "备份数的据库名:${DATABASE}"

#创建备份路径
#如果备份路径存在,就使用,否则就创建
[ ! -d "$BACKUP/$DATETIME" ] && mkdir -p "$BACKUP/$DATETIME"

#执行mysql的备份数据库命令
mysqldump -u${DB_USER} -p$DB_PWD --host=$HOST $DATABASE | gzip > $BACKUP/$DATETIME/$DATETIME.sql.gz

#打包备份文件
cd ${BACKUP}
tar -zcvf $DATETIME.tar.gz $DATETIME

#删除临时目录
rm -rf $BACKUP/$DATETIME

#删除10天前的备份文件
find $BACKUP -mtime +10 -name "*.tar.gz" -exec rm -rf {} \;

echo "=========备份完成========"
crontab -e

10 2 * * * /home/shell/testmysql.sh
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值