linux之shell编程初步
2019-03-07 本文已影响0人
suxin1932
#################适用于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})
# $* (功能描述:这个变量代表命令行中所有的参数, $*把所有的参数看成一个整体)
# $@(功能描述:这个变量也代表命令行中所有的参数, 不过$@把每个参数区分对待)
# $#(功能描述:这个变量代表命令行中所有参数的个数)
# 举例如下:获取到各个参数
echo "$0 $1 $2"
echo "$*"
echo "$@"
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 "$@"
do
echo "---------$i---------"
done
# • 基本语法2
# for (( 初始值;循环控制条件;变量变化 ))
# do
# 程序
# done
# • 应用实例
# 案例1 : 从1加到100的值输出显示 [这里可以看出$* 和 $@ 的区别]
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天前备份的数据库文件,如果有就将其删除。
###################################step1:脚本文件编写:放在/usr/sbin/mysql_db.sh文件中###############################
#完成数据库的定时备份。
#备份的路径
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 "=====备份文件成功==========="
###################################step2:调用定时任务mysql_db.sh文件中###############################
crontab -e命令进入,然后i键编辑
2 * * * /usr/sbin/mysql_db.sh
esc键退出编辑,:wq保存并退出即可
Shell中判断语句if中-z至-d的意思
[ -a FILE ] 如果 FILE 存在则为真。
[ -b FILE ] 如果 FILE 存在且是一个块特殊文件则为真。
[ -c FILE ] 如果 FILE 存在且是一个字特殊文件则为真。
[ -d FILE ] 如果 FILE 存在且是一个目录则为真。
[ -e FILE ] 如果 FILE 存在则为真。
[ -f FILE ] 如果 FILE 存在且是一个普通文件则为真。
[ -g FILE ] 如果 FILE 存在且已经设置了SGID则为真。
[ -h FILE ] 如果 FILE 存在且是一个符号连接则为真。
[ -k FILE ] 如果 FILE 存在且已经设置了粘制位则为真。
[ -p FILE ] 如果 FILE 存在且是一个名字管道(F如果O)则为真。
[ -r FILE ] 如果 FILE 存在且是可读的则为真。
[ -s FILE ] 如果 FILE 存在且大小不为0则为真。
[ -t FD ] 如果文件描述符 FD 打开且指向一个终端则为真。
[ -u FILE ] 如果 FILE 存在且设置了SUID (set user ID)则为真。
[ -w FILE ] 如果 FILE 如果 FILE 存在且是可写的则为真。
[ -x FILE ] 如果 FILE 存在且是可执行的则为真。
[ -O FILE ] 如果 FILE 存在且属有效用户ID则为真。
[ -G FILE ] 如果 FILE 存在且属有效用户组则为真。
[ -L FILE ] 如果 FILE 存在且是一个符号连接则为真。
[ -N FILE ] 如果 FILE 存在 and has been mod如果ied since it was last read则为真。
[ -S FILE ] 如果 FILE 存在且是一个套接字则为真。
[ FILE1 -nt FILE2 ] 如果 FILE1 has been changed more recently than FILE2, or 如果 FILE1 exists and FILE2 does not则为真。
[ FILE1 -ot FILE2 ] 如果 FILE1 比 FILE2 要老, 或者 FILE2 存在且 FILE1 不存在则为真。
[ FILE1 -ef FILE2 ] 如果 FILE1 和 FILE2 指向相同的设备和节点号则为真。
[ -o OPTIONNAME ] 如果 shell选项 “OPTIONNAME” 开启则为真。
[ -z STRING ] “STRING” 的长度为零则为真。
[ -n STRING ] or [ STRING ] “STRING” 的长度为非零 non-zero则为真。
[ STRING1 == STRING2 ] 如果2个字符串相同。 “=” may be used instead of “==” for strict POSIX compliance则为真。
[ STRING1 != STRING2 ] 如果字符串不相等则为真。
[ STRING1 < STRING2 ] 如果 “STRING1” sorts before “STRING2” lexicographically in the current locale则为真。
[ STRING1 > STRING2 ] 如果 “STRING1” sorts after “STRING2” lexicographically in the current locale则为真。
在中括号中,判断变量的值, 加不加双引号的问题
[ -n "$pid" ] 单对中括号,变量必须要加双引号
[[ -z $pid ]] 双对中括号,变量不用加双引号
[[ ]] 双对中括号,是不能使用 -a 或者 -o的参数进行比较的
[ ] 可以使用 -a -o的参数,但是必须在 [ ] 中括号内,判断条件
[ 5 -lt 3 -o 3 -gt 2 ] #或者条件成立
[5 -lt 3 ] -o [ 3 -gt 2] #或者条件, 这个不成立,因为必须在中括号内判断
如果想在中括号外判断两个条件,必须用&& 和 || 比较
[5 -lt 3 ] || [ 3 -gt 2] #成立
[5 -gt 3 ] && [ 3 -gt 2] #成立
当判断某个变量的值是否满足正则表达式的时候,必须使用[[ ]] 双对中括号