Linux学习之Shell编程
在Linux中经常用到Shell脚本,简单学习下Shell编程吧。
Shell 编程
变量
注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。
使用一个定义过的变量,只要在变量名前面加美元符号即可。
#!/bin/bash your_name="Lee" echo $your_name echo ${your_name} #变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界
Shell 字符串
#!/bin/bash str="abcdefg" #获取字符串长度 echo ${#str} #7 #提取子字符串 从字符串第 2 个字符开始截取 4 个字符 echo ${str:1:4} #bcde #查找子字符串 查找字符 i 或 o 的位置(哪个字母先出现就计算哪个) str="hello world." echo `expr index "$str" io` #5
传递参数
我们可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n。n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推……
#!/bin/bash # author:菜鸟教程 # url:www.runoob.com echo "Shell 传递参数实例!"; echo "执行的文件名:$0"; echo "第一个参数为:$1"; echo "第二个参数为:$2"; echo "第三个参数为:$3";
执行
$ chmod +x test.sh $ ./test.sh 1 2 3 Shell 传递参数实例! 执行的文件名:./test.sh 第一个参数为:1 第二个参数为:2 第三个参数为:3
条件判断
布尔运算
运算符 | 描述 | 示例 |
---|---|---|
! | 非关系,条件结果取反 | [ ! 1 -eq 2 ]为true |
-a | 与关系,在[]表达式中使用 | [ 1 -eq 1 -a 2 -eq 2 ]为true |
-o | 或关系,在[]表达式中使用 | [ 1 -eq 1 -o 2 -eq 1 ]为true |
逻辑运算
运算符 | 描述 | 示例 |
---|---|---|
&& | 逻辑与,在[[]]和(())表达式中时使用 | [[ 1 -eq 1 && 2 -eq 2 ]]为 true; (( 1 == 1 && 2 == 2 ))为true;[ 1 -eq 1 ] && echo yes 如果&&前 面表达式为 true 则执行后面的 |
|| | 逻辑或,在[[]]和(())表达式中时使用 | [[ 1 -eq 1 || 2 -eq 1 ]]为 true;(( 1 == 1 || 2 == 2 ))为true;[ 1 -eq 2 ] || echo yes 如果 || 前面表达式为 false 则执行后面的 |
if条件
#!/bin/bash if [ $1 -ge 60 ] then echo "及格了" elif [ $1 -lt 60 ] then echo "不及格" fi if [ "ok"="ok" ] then echo "equal" fi if [ 23 -ge 22 ] then echo "ok" fi P1="/home/apple/shellCode/position.sh" if [ -f $P1 ] then echo "$P1 存在" fi if [ -x $P1 ] then echo "$P1 有执行的权限" fi
case
#!/bin/bash case $1 in "1") echo "周一" ;; "2") echo "周二" ;; "3") echo "周三" ;; *) echo "other.." ;; esac
for 循环
#!/bin/bash for i in "$*" do echo "num is $i" done echo "---------------" for j in "$@" do echo "num is $j" done
#!/bin/bash SUM=0 #for (( i=1; i <= 100; ++i )) for (( i=1; i <= $1; ++i )) do SUM=$[$SUM + $i] done echo "$SUM"
while循环
#!/bin/bash SUM=0 i=1 while [ $i -le $1 ] do SUM=$[ $SUM + $i ] i=$[$i + 1] done echo "SUM=$SUM"
自定义函数
#!/bin/bash #定义函数 function getSum(){ SUM=$[$n1+$n2] echo "SUM=$SUM" } #输入两个数 read -p "please input a number n1=" n1 read -p "please input a number n2=" n2 #调用自定义函数 getSum $n1 $n2
例子:(备份mysql数据库)
vim /usr/sbin/myshell/mysql_db_backup.sh
#!/bin/bash #备份目录 BACKUP="/data/backup/db" #当前时间 DATETIME=$(date +%Y-%m-%d_%H%M%S) echo $DATETIME echo "${DATETIME}.sql.gz" #数据库地址 HOST=localhost #数据库用户名和密码 DB_USER=root DB_PW=123456 #备份的数据库名 DB_NAME=hello01 #创建备份目录,若不存在,就创建 [ ! -d "${BACKUP}/${DATETIME}" ] && mkdir -p "${BACKUP}/${DATETIME}" #备份数据库 mysqldump -u${DB_USER} -p${DB_PW} --host=${HOST} -q -R --databases ${DB_NAME} | gzip > "${BACKUP}/${DATETIME}/$DATETIME.sql.gz" #将文件夹处理成 tar.gz cd ${BACKUP} tar -czvf ${DATETIME}.tar.gz ${DATETIME} #删除对应的目录 rm -rf ${BACKUP}/${DATETIME} #删除10天前的备份文件 find ${BACKUP} -mtime +10 -name "*.tar.gz" -exec rm -rf {} \; echo "备份数据库$DB_NAME 成功"
然后用 cron 定时调度 执行该shell脚本
crontab -e
进入编辑,每天02:30执行该shell脚本
30 2 * * * /usr/sbin/myshell/mysql_db_backup.sh
用 crontab -l 可以查看
常记溪亭日暮,沉醉不知归路。兴尽晚回舟,误入藕花深处。争渡,争渡,惊起一滩鸥鹭。
昨夜雨疏风骤,浓睡不消残酒。试问卷帘人,却道海棠依旧。知否?知否?应是绿肥红瘦。