shell编程

​ Shell是用户与Linux操作系统之间沟通的桥梁。用户可以输入命令,又可以利用Shell脚本编程去执行

一、变量

SHELL 变量可分为两类:局部变量和环境变量。

  1. 局部变量:

    ​ 简单的理解变量,相当于定义一个别名=名称,引用的时候加上$符号
    就可以了。

    #例如定义变量 
    name=wuguangke
    #执行 将会显示 wuguangke
    echo $name 
    
  2. 常见的系统变量

#当前用户的ID,root为0
echo $UID
#当前所在的目录
echo $PWD
#当前程序的名称
echo $0
#当前程序的第1个参数(第n个即为$n)
echo $1
#当前程序第1第2个参数
echo $1 $2

#判断上一个命令是否执行成功,成功为0
echo "The \$? is $?"
#打印所有参数$*
echo "The \$* is $*"
#统计参数个数$#
echo "The \$# is $#"
#使打印内容有颜色
echo -e '\033[32m---------------------------\033[0m'

-n:测试脚本是否存在问题

/bin/bash -n first_shell.sh

-x:查看脚本执行的过程
/bin/bash -x sum.sh

二、常用的命令

#打印当前系统日期(必须加反引号,代表解析为命令)
echo `date +%Y%m%d`

#求和,结果为27
expr 12 + 15

#打印行数
wc -l

#备份(快照和增量)
tar -g

#用于检查及删除文本文件中重复出现的行列,一般与 sort 命令结合使用。
uniq
-c或--count:在每列旁边显示该行重复出现的次数。

#远程执行命令(不登陆)
#-q:禁止输出别的信息
#ssh  -l  userName  ip  command
ssh -l root 192.168.0.5 ps -ef|grep nginx
#远程登陆
ssh -l userName ip

#强制同步成两个目录相同
rsync -ap --delete 源目录 目标目录

# 日期运算
date -d "-1 day" +%d 前一天的日期

date -d "-1 hour" +%H 前一小时

date -d "-1 min" +%M 前一分钟

date -d '-1 day' +%F 前一天的日期(年月日)

date -d yesterday +%Y%m%d 昨天

三、条件控制语句

​ 在shell编程中,if、for、while、case等条件条件流程控制语句用的非常多

常见的逻辑运算符解析:

  • -f 判断文件是否存在 eg: if [ -f filename ]
  • -d 判断目录是否存在 eg: if [ -d dir ]
  • -eq 等于 应用于:整型比较
  • -ne 不等于 应用于:整型比较
  • -lt 小于 应用于:整型比较
  • -gt 大于 应用于:整型比较
  • -le 小于或等于 应用于:整型比较
  • -ge 大于或等于 应用于:整型比较
  • -a 双方都成立(and) 逻辑表达式 –a 逻辑表达式
  • -o 单方成立(or) 逻辑表达式 –o 逻辑表达式
  • -z 空字符串

其他命令:

  • && 前面命令执行成功才执行后面的命令
  • ;不管前面命令成功与否,都会执行后面的
if条件判断语句
# shell中两个小括号为比对大小

# if (表达式);then
# 	语句 1
# elif (表达式);then
#	语句 2
# else
# 	语句 3
# fi

#比较大小
NUM1=100
NUM2=200

if (($NUM1 > $NUM2));then
	echo "$NUM1"
else
	echo "$NUM2"
fi


#判断文件是否存在(!为不存在)
DIR=/data/20200625
if [ ! -d $DIR ];then
	mkdir -p $DIR
else
	echo “This DIR is exist,Please exit..fi
实现一个mysql备份脚本:
#!/bin/bash
#FileName:auto_backup_mysql.sh
#auto backup mysql db
#by authors pasiyu 20200625

BAK_DIR=/pasiyu/`date +%Y%m%d`
MYSQLUSER=root
MYSQLPWD=123456
MYSQLDB=pasiyu
MYSQLCMD=/usr/bin/mysqldump

#查看是否为root用户,[]为整数,[[]]字符串
if [ $UID -ne 0 ];then
	echo -e '\033[32mNot root\033[0m'
	exit
fi

#查看是否有此目录
if [ ! -d $BAK_DIR ];then
	mkdir -p $BAK_DIR
	echo -e '\033[32mThe $BAK_DIR create successfully!\033[0m'
else
	echo "This $BAK_DIR is exists"
fi

#mysql备份命令
$MYSQLCMD -u$MYSQLUSER -pMYSQLPWD -d $MYSQLDB >$BAK_DIR/$MYSQLDB.sql

#检查备份命令是否执行成功
if [ $? -eq 0 ];then
	echo "successfuly"
else
	echo -e '\033[32mFailed\033[0m'
fi

每天定时执行:添加任务计划
crontab -e
0 0 * * * /bin/bash /pasiyu/auto_backup_mysql.sh >> /tmp/mysql_bak.log

for循环
# for 变量 in 字符串
# do      
# 		语句1
# done

案例一、

#!/bin/bash
#for循环打印1到15

#seq 1 15 为遍历1-15
for i in `seq 1 15`
do
	echo -e "\033[32mThe number is $i\033[0m"
done

案例二、

#!/bin/bash
#FileName:sum.sh
#计算1-100的和
#by authors pasiyu 2020

j=0

for ((i=1;i<=100;i++))

do
	j=`expr $i + $j`
done

echo $j
while条件语句
# while 条件语句
# do
# 		语句1
# done

案例一、

#!/bin/bash

i=0

while (( $i <= 10 ))

do
	echo "The number is $i"
	((i++))
done

案例二、

#读取用户输入内容赋值到input
read -p "Please Input number:" input
$input
#!/bin/bash
#逐行读取/etc/hosts文件的内容

#while实现
while read line

do
	echo $line
done </etc/hosts

#for实现
for i in `cat hosts`

do
	echo $i
done
until循环语句
#区别:直到满足条件才退出,否则执行语句1

# until 条件
# do
# 		语句1
# done
#!/bin/bash

a=5

until (( $a < 1 ))

do
	echo $a
	((a--))
done

#结果:
# 5
# 4
# 3
# 2
# 1
case选择语句
#如果为a则执行语句1,b执行语句2,其他执行语句3
case $1 in
	a )
	语句1
	;;
	b )
	语句2
	;;
	* )
	语句3
	;;
esac

案例一、

#!/bin/bash


case $1 in
	
	Apache)
	echo "-----Apache------"
	;;
	Mysql)
	echo "------Mysql------"
	;;
	Nginx)
	echo "------Nginx------"
	;;
	*)
	echo -e  "\033[32mUsage:{/bin/bash $0 Apache|Mysql|Nginx|help}\033[0m"
	;;
	
esac
select选择
#!/bin/bash

#PS3为选择菜单的打印信息,固定变量
PS3="请选择您要执行的:"

select i in "mysql" "nginx" "rabbitmq"

do
	echo $i
done

结果:

1) mysql
2) nginx
3) rabbitmq
请选择您要执行的:

四、数组

#/bin/bash

#定义一个数组
soft=(
	mysql
	nginx
	php
)

#查看数组总数量
echo "This soft total ${#soft[@]}"
#查看数组第一个元素
echo ${soft[0]}
#查看数组所有元素
echo ${soft[@]}
#替换nginx
echo ${soft[@]/nginx/go}
#删除一个元素
unset soft[2]
echo ${soft[@]}

结果:

This soft total 3
mysql
mysql nginx php
mysql go php
mysql nginx

五、linux函数

函数就相当于一个简单的命令所包括的很多命令的集合

格式:

function 函数名()
{
	语句1
	语句2
	......
}

#调用
函数名

六、awk、sed等命令详解

#sed:修改

#直接在命令行修改,不需要编辑文件,不加任何参数为预修改
#加参数-i为修改
#格式 sed -i 's/old/new/g' test.txt

#将test.txt中的10修改为168
sed -i 's/10/168/g' test.txt
#在每行开头添加“id ”,^为开头,$为末尾,&为添加
sed 's/^/&id /g' test.txt
#在pasiyu之后的添加一行t007
#a为之后添加,i为之前
sed '/pasiyu/a t007' test.txt
#匹配pasiyu这一行并打印
#-n为打印,1p代表第一行
sed -n '/pasiyu/p' test.txt
#打印第一行
#1-5行为'1,5p'
sed -n '1p' test.txt

#eg1
#从number.txt打印最大最小值
#sed把空格换成换行,grep去除以空开头以空结尾的行,sort排序 -nr:从大大小
cat number.txt|sed 's/ /\n/g'|grep -v "^$"|sort -nr|sed -n '1p;$p'
#grep:匹配

#打印所有包含323的
cat number.txt |grep "323"
#-v:不匹配
#打印除了323的
cat number.txt |grep -v "323"

#匹配11开头,"11$"为结尾
grep "^11" number.txt
#匹配0-9
grep "[0-9]" test.txt

#所有包含323的,并把323修改为345
cat number.txt |grep "323"|sed 's/323/345/g'


#egrep:深度匹配 = grep -E

#匹配11或pasiyu的:
grep "11|pasiyu" test.txt

#去掉grep本身这条
grep -v grep
#awk:
#-v:赋值

# cat test.txt
# My:a name is pasiyu

#打印第3列
cat test.txt |awk '{print $3}'
#打印最后一列
cat test.txt |awk '{print $NF}'

#-F=format,":"代表以:分隔
cat test.txt |awk -F: '{print $1}'

#打印第三列,并在前面添加echo
cat test.txt |awk '{print "echo "$3}'

#如果ip.txt.swp中第一列等于1,则打印它的第二例
awk '{if(1==$1)print $2}' ip.txt.swp
#find:查找

#格式
find path -name ""

#查找test.txt文件
#"/":为根目录,".":当前目录
find / -name "test.txt"

#只查找第一级目录 -maxdepth 1
find / -maxdepth 1 -name "test.txt"

#查找第一级目录文件类型的,f代表文件
find / -maxdepth 1 -type f

#找出大于20m的
find . -size +20M

# -mtime +30 :代表30天以前修改的
# -mtime -1 :代表1天之内修改的

#找出并删除,{}代表引入前面查找到的,-exec代表后面跟命令
-exec rm -rf {} \
#拷贝到tmp下
-exec cp {} /tmp/ \
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值