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编程初步的主要内容,如果未能解决你的问题,请参考以下文章