linux之shell编程初步

Posted psy-code

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux之shell编程初步相关的知识,希望对你有一定的参考价值。

###################################适用于CentOS6

#!/bin/bash ################################################################################ # 1.测试 echo "hello world" ################################################################################ # 2.常用系统变量 echo "user=$USER" echo "path=$PATH" # 要执行上面的语句有两种方式 # 方式1:给用户赋予该脚本的可执行权限 # chmod 744 文件名(此处是helloworld.sh) # 然后 在该文件所在目录下./文件名或者使用该文件的绝对路径执行即可 # 方式2:直接采用sh 文件名执行 ################################################################################ # 3.定义一个变量,切记,不可有空格!!!!!!!!!!! a=10 echo a="$a" # 3.1注销该变量 unset a echo a="$a" # 3.2声明静态变量: readonly变量,注意:不能unset readonly b=11 echo b="$b" # ? 定义变量的规则 # 1) 变量名称可以由字母、数字和下划线组成,但是不能以数字开头。 # 2) 等号两侧不能有空格 # 3) 变量名称一般习惯为大写 # ? 将命令的返回值赋给变量 # 1) A=`ls -la` 反引号,运行里面的命令,并把结果返回给变量A result=`ls -l /home` echo result="$result" # 2) A=$(ls -la) 等价于反引号 MY_DATE=$(date) echo mydate="$MY_DATE" # 3.3设置环境变量(一般在/etc目录下的profile文件中) # 基本语法 # 1) export 变量名=变量值 (功能描述:将shell变量输出为环境变量) # 2) source 配置文件 (功能描述:让修改后的配置信息立即生效) # 3) echo $变量名 (功能描述:查询环境变量的值) # 3.4位置参数变量 # 介绍 # 当我们执行一个shell脚本时,如果希望获取到命令行的参数信息,就可以使用到位置参数变量 # 比如 : ./myshell.sh 100 200 , 这个就是一个执行shell的命令行,可以在myshell 脚本中获取到参数信息 # 基本语法 # $n (功能描述: n为数字, $0代表命令本身, $1-$9代表第一到第九个参数,十以上的参数,十以上的参 # 数需要用大括号包含,如${10}) # $* (功能描述:这个变量代表命令行中所有的参数, $*把所有的参数看成一个整体) # [email protected](功能描述:这个变量也代表命令行中所有的参数, 不过[email protected]把每个参数区分对待) # $#(功能描述:这个变量代表命令行中所有参数的个数) # 举例如下:获取到各个参数 echo "$0 $1 $2" echo "$*" echo "[email protected]" echo "参数个数是: length of the params are:$#" # 测试方式是: ./文件名 参数1 参数2 参数3 # 3.5预定义变量 # 基本介绍 # 就是shell设计者事先已经定义好的变量,可以直接在shell脚本中使用 # 基本语法 # $$ (功能描述:当前进程的进程号(PID)) # $! (功能描述:后台运行的最后一个进程的进程号(PID)) # $?(功能描述:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正 # 确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。) echo "当前进程的进程号是$$" # 后台运行某文件的方式是: ./a.sh & echo "后台运行的最后一个进程的进程号是:$!" echo "最后一次的执行命令是否成功: $?" ################################################################################ # 4.shell脚本中的运算符 # 4.1基本语法 # 1) “$((运算式))”或“$[运算式]” # 2) expr m + n # 注意expr运算符间要有空格 # 3) `expr m - n` # 4) expr *, /, % 乘,除,取余 # ? 应用实例 # 案例1: 计算(2+3) X4的值 plus=$(((2+1)*3)) echo "plus=$plus" plus1=$[(3+4)/2] echo "plus1=$plus1" plus2=`expr 3 + 4 * 5` echo "plus2=$plus2" # 案例2:请求出命令行的两个参数[整数]的和 plus3=$[$1+$2] echo "plus3=$plus3" ################################################################################ # 5.条件判断 # 判断语句 # ? 基本语法 # [ condition ](注意condition前后要有空格) # 非空返回true,可使用$?验证(0为true, >1为false) # 5.1应用实例 # [ hello ] 返回true # [] 返回false # [condition] && echo OK || echo notok 条件满足,执行后面的语句 # 5.2常用判断条件 # 1) 两个整数的比较 # = 字符串比较 # -lt 小于 # -le 小于等于 # -eq 等于 # -gt 大于 # -ge 大于等于 # -ne 不等于 # 2) 按照文件权限进行判断 # -r 有读的权限 # -w 有写的权限 # -x 有执行的权限 # 3)按照文件类型进行判断 # -f 文件存在并且是一个常规的文件 # -e 文件存在 # -d 文件存在并是一个目录 # 4) 应用实例 # 案例1: "ok"是否等于"ok" # 判断语句: if [ "ok" = "ok" ] then echo "equal" fi # 案例2: 23是否大于等于22 if [ 23 -gt 22 ] then echo "大于" fi # 判断语句: # 案例3: /root/shell/aaa.txt 目录中的文件是否存在 # 判断语句: if [ -e /home/zhang/shell/a.sh ] then echo "文件存在" fi # 5.3流程控制之-----if 判断 # ? 基本语法 # if [ 条件判断式 ];then # 程序 # fi # 或者 # if [ 条件判断式 ] # then # 程序 # elif [条件判断式] # then # 程序 # fi # 注意事项:(1) [ 条件判断式 ],中括号和条件判断式之间必须有空格 (2) 推荐使用第二种方式 # ? 应用实例 # 案例:请编写一个shell程序,如果输入的参数,大于等于60,则输出 "及格了",如果小于 # 60,则输出 "不及格" if [ $1 -ge 60 ] then echo "及格了" elif [ $1 -lt 60 ] then echo "不及格" fi # 5.4流程控制之-----case语句 # ? 基本语法 # case $变量名 in # "值1") # 如果变量的值等于值1,则执行程序1 # ;; # "值2") # 如果变量的值等于值2,则执行程序2 # ;; # …省略其他分支… # *) # 如果变量的值都不是以上的值,则执行此程序 # ;; # esac # ? 应用实例 # 案例1 :当命令行参数是 1 时,输出 "周一", 是2 时,就输出"周二", 其它情况输出 "other" case $1 in "1") echo "周一" ;; "2") echo "周二" ;; *) echo "other" ;; esac # 5.5流程控制之-----for循环 # ? 基本语法1 # for 变量 in 值1 值2 值3… # do # 程序 # done # ? 应用实例 # 案例1 :打印命令行输入的参数 for i in "$*" do echo "=========$i=========" done for i in "[email protected]" do echo "---------$i---------" done # ? 基本语法2 # for (( 初始值;循环控制条件;变量变化 )) # do # 程序 # done # ? 应用实例 # 案例1 : 从1加到100的值输出显示 [这里可以看出$*[email protected] 的区别] sum=0 for (( i=1;i<=100;i++ )) do sum=$[$sum+$i] done echo "sum=$sum" # 5.6流程控制之-----while循环 # ? 基本语法1 # while [ 条件判断式 ] # do # 程序 # done # ? 应用实例 # 案例1 :从命令行输入一个数n,统计从 1+..+ n 的值是多少? sum1=0 j=0 while [ $j -le $1 ] do sum1=$[$sum1+$j] j=$[$j+1] done echo "sum1=$sum1" ################################################################################ 6.read读取控制台输入 # 基本语法 # read(选项)(参数) # 选项: # -p:指定读取值时的提示符; # -t:指定读取值时等待的时间(秒) ,如果没有在指定的时间内输入,就不再等待了。。 # 参数 # 变量:指定读取值的变量名 # 应用实例 # 案例1: 读取控制台输入一个num值 read -p "请输入一个数字no1=" no1 echo "你输入的数数字no1是$no1" # 案例2: 读取控制台输入一个num值,在10秒内输入。 read -t 10 -p "请在10秒内输入一个数字no2=" no2 echo "你输入的数字no2是$no2" ################################################################################ # 7.函数 # 7.1系统函数 # 7.1.1 basename基本语法 # 功能:返回完整路径最后 / 的部分,常用于获取文件名 # basename [pathname] [suffix] # basename [string] [suffix] (功能描述: basename命令会删掉所有的前缀包括最后一个(‘/’) # 字符,然后将字符串显示出来。 # 选项: # suffix为后缀,如果suffix被指定了, basename会将pathname或string中的suffix去掉。 # ? 应用实例 # 案例1:请返回 /home/aaa/test.txt 的 "test.txt" 部分 basename /home/aaa/test.txt basename /home/aaa/test.txt .txt # 7.1.2 dirname基本语法 # 功能:返回完整路径最后 / 的前面的部分,常用于返回路径部分 # dirname 文件绝对路径 (功能描述:从给定的包含绝对路径的文件名中去除文件名(非目录的部分), # 然后返回剩下的路径(目录的部分)) # ? 应用实例 # 案例1:请返回 /home/aaa/test.txt 的 /home/aaa dirname /home/aaa/test.txt # 7.2自定义函数 # ? 基本语法 # [ function ] funname[()] # { # Action; # [return int;] # } # 调用直接写函数名: funname [值] # ? 应用实例 # 案例1: 计算输入两个参数的和, getSum function getSum(){ s=$[$n1+$n2] echo "$s" } read -p "请输入一个数字n1=" n1 read -p "请输入一个数字n2=" n2 # 调用函数 getSum $n1 $n2

 

# 8.需求分析
# 1) 每天凌晨 2:10 备份 数据库 atguiguDB 到 /data/backup/db
# 2) 备份开始和备份结束能够给出相应的提示信息
# 3) 备份后的文件要求以备份时间为文件名,并打包成 .tar.gz 的形式,比如:
# 2018-03-12_230201.tar.gz
# 4) 在备份的同时,检查是否有10天前备份的数据库文件,如果有就将其删除。
#完成数据库的定时备份。
#备份的路径
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 "=====备份文件成功==========="

 

 

技术分享图片

技术分享图片

 



以上是关于linux之shell编程初步的主要内容,如果未能解决你的问题,请参考以下文章

shell编程脚本初步

Linux Shell编程之基本概念

shell编程初步grep及正则表达式

Linux之Shell编程(13)--Shell文件包含

Linux之Shell编程(13)--Shell文件包含

Shell编程初步