Shell是用户与Linux操作系统之间沟通的桥梁。用户可以输入命令,又可以利用Shell脚本编程去执行
一、变量
SHELL 变量可分为两类:局部变量和环境变量。
-
局部变量:
简单的理解变量,相当于定义一个别名=名称,引用的时候加上$符号
就可以了。#例如定义变量 name=wuguangke #执行 将会显示 wuguangke echo $name -
常见的系统变量
#当前用户的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/ \
685

被折叠的 条评论
为什么被折叠?



