Shell编写

语法

echo "====================变量撤销(unset)======================="
#声明变量A
A=i
echo "a=$A"
#撤销变量A
unset A
echo "a=$A"


echo "====================只读变量(readonly)======================="
#声明只读变量B
readonly B=-100
#只读变量不能被撤销
unset B
echo "b=$B"
#也不能被赋值
B=200
echo "b=$B"



echo "====================返回值赋值给变量======================="
#使用反单引号的方式
RESULT=`ls -la /home`
echo "$RESULT"
#使用$()的方式
MY_DATE=$(date)
echo "$MY_DATE"



echo "====================多行注释(:<<! 内容  !)======================="
:<<!
echo "11111111111111111111111"
echo "11111111111111111111111"
echo "11111111111111111111111"
!



echo "====================设置环境变量(其它shell也可用)======================="
echo "第一步打开配置文件:vim /etc/profile’"
echo "第二步编写配置文件:‘TEST_VAR=123456789’ 换行输出变量 ‘export TEST_VAR’"
echo "第三步更新配置:‘source /etc/profile’"
echo "第四步使用变量:‘$TEST_VAR’"



echo "====================位置参数变量(执行shell脚本时输入参数如:./myshell.sh 100 200 300)======================="
echo "使用\$0-\$9获取参数 0=bash名字 1-91-9的参数: \$0=$0 \$1=$2"
echo "使用\$*获取所有参数参数看成一个整体(字符串):$*"
echo "使用\$@获取所有参数参区分对(数组):$@"
echo "使用\$\#获取参数数量:$#"
echo "使用\${0}获取参数(\$0-\$9只能获取小于10个的参数):\${2}=${2}"




echo "====================预定义变量======================="
echo "使用\$\$获取当前进程号也就是本身:$"
#后台执行方式运行test.sh(后面加一个&符号)
#./test.sh  &
echo "使用\$!获取最后的进程编号:$!"
echo "使用\$?获取执行的值:$?"



echo "====================运算符======================="
R1=$((2+8))
R2=$[(2+9)*4]
echo "1)'\$((运算式))'或'\$[运算式]' : $R1 $R2"
R1=`expr 2 + 3`
R2=`expr $R1 \* 5`
echo "2)expr m + n 注意expr运算符间要有空格 expr 20 - 5"
echo "expr \*,/,% 乘,除,取余 : $R1 $R2"




echo "====================条件判断======================="
echo "1)======两个整数的比较============="
echo "=:字符串比较"
echo "-lt:小于"
echo "-le:小于等于"
echo "-eq:等于"
echo "-gt:大于"
echo "-ge:大于等于"
echo "-ne:不等于"
echo "2)======文件权限判断============="
echo "-r:有读的权限"
echo "-w:有写的权限"
echo "-x:有执行的权限"
echo "3)======文件类型判断============="
echo "-f:文件存在并且是一个常规的文件"
echo "-e:文件存在"
echo "-d:文件存在并是一个目录"

if [ "ok" = "ok" ]
then
	echo "OK=OK"
fi


if [ 23 -gt 20  ]
then
	echo "23>22"
fi

if [ -e /home/shell/myshell.sh ]
then
	echo "myshell.sh存在"
fi

if [ -x /home/shell/myshell.sh ]
then 
	echo "有写的权限"
fi






echo "====================流程控制======================="
echo "===========if================"
OK="ok"
if [ $OK = "ok" ]
	then
		echo "ok"
	elif [ $OK = "ko" ]
	then
		echo "ko"
	elif [ $OK = "kk" ]
	then
		echo "kk"
fi 
echo "===========case================"
case  $OK in
"ok")
	 echo "ok"
;;
"ko")
	 echo "ko"
;;
"*")
	echo "kk"
;;
esac

 

echo "===========for================"
echo "打印输入的参数"
for i in "$@"
do
	echo "参数$i"
done

SUM=0
for ((i=1;i<=100;i++))
do
	SUM=$(($SUM+$i))	
done
echo "SUM=$SUM"


echo "===========while================"
SUM=0
I=0
while [ $I -le $1 ]
do
	SUM=$[$SUM+$I]
	I=$[$I+1]
done
echo "SUM=$SUM"





echo "====================读取控制台输入======================="
read -p "请输入一个数num1=" NUM1
echo "你输入的值是num1=$NUM1"

read -t 10 -p "请在10秒内输入一个数num2=" NUM2
echo "你输入的值是num2=$NUM2"


echo "====================系统函数======================="
echo "basename(获取文件名加后缀): `basename /home/shell/myshell.sh`"
echo "basename(获取文件名不要后缀):`basename /home/shell/myshell.sh .sh`"
echo "dirname(获取路径除去文件部分):`dirname /home/shell/myshell.sh`"

echo "自定义函数调用"
function getSum(){
	SUM=$[$n1+$n2]
	echo "SUM=$SUM"
}

n1=1
n2=2
getSum $n1 $n2


综合案例

#!/bin/bash

#完成数据库的定时备份。
#备份的路径
BACKUP=/data/backup/db
#当前的时间作为文件名
DATETIME=$(date +%Y_%m_%d_%H%M%S)
#可以输出变量调试
#echo ${DATETIME}

echo "=======开始备份========"
echo "=======备份的路径是 $BACKUP/$DATETIME.tar.gz"

#主机
HOST=localhost
#用户名
DB_USER=root
#密码
DB_PWD=root
#备份数据库名
DATABASE=atguiguDB
#创建备份的路径
#如果备份的路径文件夹存在,就使用,否则就创建
[ ! -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 "=====备份文件成功==========="


(1)