linuxz之shell编程

linuxz之shell编程

1.为什么要学习shell编程

1)Linux运维工程师在进行服务器集群管理时,需要编写shell程序来进行服务器管理。

2)对于python或者其他程序员来说,工作的需要,可能需要编写一些shell脚本进行程序或者是服务器的维护,比如编写一个简单的定时备份数据库的脚本。

3)对于大数据程序员来说,需要编写shell程序来管理集群。

2.Shell是什么

shell是一个命令行解释器,它为用户提供一个向Linux内核发送请求以便运行程序的界面系统级程序。

3.Shell编程的入门

3.1脚本的格式要求

1)脚本以#!/bin/bash开头

2)脚本需要你给一个执行权限

3.2编写入门级的第一个shell脚本

先创建一个shell脚本,输出hello eorld!过程代码如下:

创建一个shell脚本:

(base) [root@VM_0_17_centos home]# vim hjw.sh

编写一段简单的shell脚本:

#!/bin/bash
echo "hello,world!"
#echo 就相当于print 和printf或者java里面的System.out.println
#这个符号是注释的意思
#  :<
#  ! 这一起是多行注释的意思

编写完后要执行,而脚本的执行方式有两种

1)首先是 sh+脚本的方式,这种方式不用给予脚本x权限,直接执行就可以

(base) [root@VM_0_17_centos home]# sh ./hjw.sh
hello,world!
(base) [root@VM_0_17_centos home]#

2)给予脚本x的权限,然后直接执行脚本

(base) [root@VM_0_17_centos home]# chmod 744 hjw.sh
(base) [root@VM_0_17_centos home]# ./hjw.sh #这和c语言执行相似
hello,world!

4.shell的变量学习

4.1shell变量的介绍

1)Linux shell 中变量分为,系统变量和自定义变量。

2)系统变量例如: H O M E 、 HOME、 HOMEPWD、 S H E L L 、 SHELL、 SHELLPATH等。

3)可以使用set显示所有变量

(base) [root@VM_0_17_centos home]# echo "PATH=$PATH"
PATH=/root/anaconda3/bin:/root/anaconda3/condabin:/root/julia-1.1.1/bin:/usr/java/jdk-13/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/local/python3/bin:/opt/go/bin:/root/bin
4.2自定义shell的变量

基本语法和规则:

1)定义变量:变量=值

2)撤销变量:unset 变量

3)声明静态变量:readonly变量,这里就不能使用unset撤销了

4)变量名称可以由字母、数字和下划线组成,但是不能以数字开头

5)等号两侧不能有空格

6)变量名称一般习惯大写,就像java类名一样

下面我将上面的语法演示一遍:

#!/bin/bash
B=520      #定义变量
echo "B=$B"
unset B    #撤销变量
echo "B=$B"
readonly C=1314 #定义静态变量
echo "C=$C"

运行结果:

(base) [root@VM_0_17_centos home]# chmod 744 liu.sh
(base) [root@VM_0_17_centos home]# ./liu.sh
B=520
B=
C=1314
4.3.将命令的返回值赋值给变量

有两种方式:

1)A=ls-la 反引号,运行里面的命令,并把结果返回给变量A

2)A=$(ls-la)等价于反引号

A=`ls -l /home|more`
echo  $A
echo ""
B=$(date)
echo $B

运行结果:

(base) [root@VM_0_17_centos home]# ./liu.sh
total 72 -rw-r--r-- 1 root root 1436 Nov 1 13:45 111.txt drwxr-xr-x 2 root root 4096 Oct 17 18:07 1223 -rw-r--r-- 1 root root 394 Nov 1 14:12 1.tar.gz drwxr-xr-x 3 root root 4096 Oct 30 20:25 dir1 -rw-r--r-- 1 root root 122 Nov 1 13:28 dirl -rwxr--r-- 1 root root 527 Nov 2 13:46 helloworld.sh 

Sat Nov 2 13:51:50 CST 2019

5.用shell设置环境变量

1)export 变量名=变量值 (将shell变量输出为环境变量)

2)souree 配置文件 (让修改的配置信息生效)

3)echo $变量名 (查询环境变量的值)

6.位置参数变量

$n(功能描述:n为数字,$0代表是命令本身,$1- 9 代 表 第 一 道 第 九 参 数 , 十 以 上 的 参 数 用 大 括 号 , 如 9代表第一道第九参数,十以上的参数用大括号,如 9{10})

$*(这个变量代表命令行中所有参数,这个把所有参数看成一个整体)

@ ( 这 个 变 量 代 表 命 令 行 中 所 有 参 数 , 不 过 @(这个变量代表命令行中所有参数,不过 @(@把每个参数区分对待)

$#(这个变量代表命令行中所有参数的个数)

下面写一段代码应用上面的实例

echo "$0 $1 $2"
echo "$*"
echo "$@"
echo "参数个数=$#"

运行结果:

(base) [root@VM_0_17_centos home]# ./liu.sh 520 1314
./liu.sh 520 1314
520 1314
520 1314
参数个数=2

7.预定义变量

预定义变量就是shell设计者事先已经定义好了的变量,可以直接在shell脚本中使用

基本语法:

$$(当前进程的进程号(PID))

$!(后台运行的最后一个进程号)

$?(最后一次执行的命令的返回状态,如果是0,证明上个命令正确执行;如果这个变量的值非0,则证明上个命令执行不正确)

应用实例

echo "当前的进程号=$$"
./liu.sh &
echo "最后的进程的号=$!"
echo "执行的值=$?"

8.运算符

1)“ ( ( 运 算 式 ) ) ” 或 “ ((运算式))”或“ (())[运算式]”

2)expr m+n

3)expr m-n

4)expr / ,% 除,取余

应用实例

A=$(((6+9)*8))
echo "A=$A"
B=$[(6+9)*8]
echo "B=$B"
C=`expr 6 + 9`
D=`expr $C \* 4`
echo "D=$D"

运行结果:

(base) [root@VM_0_17_centos home]# ./liu.sh
A=120
B=120
D=60

9.条件判断

9.1基本语法

[ condition ] #非空返回true,可使用$?验证(0为true,>1为false)

例如 [ condition ] &&echo OK ||echo notok 条件满足,执行后面的语句

9.2常用判断条件

1)两个整数的比较

=字符串比较;-lt 小于;-le 小于等于;-eq 等于;-gt 大于;-ge 大于等于;-ne 不等于

2)按照文件权限进行判断

-r 可读的权限;-w 有可写的权限;-x 有执行的权限

3)按照文件类型分类

-f 文件存在并且是一个常规的文件;-e 文件存在;-d 文件存在并且是一个目录

应用实例

if [ 23 -gt 22 ]
then
     echo "大于"
fi

运行结果:

(base) [root@VM_0_17_centos home]# ./liu.sh
大于

10.流程控制

10.1 if判断

基本语法

if [ 条件判断式 ];then

​ 程序

fi

或者

if [ 条件判断式 ] #括号和判断式之间必须有空格

then

​ 程序

​ elif [ 条件判断式 ]

​ then

​ 程序

fi

应用实例

if [ $1 -ge 60 ]
  then
    echo "及格"
elif [ $1 -lt 60 ]
   then
    echo "不及格"
fi

运行结果

(base) [root@VM_0_17_centos home]# ./liu.sh 90
及格
10.2case语句

case $变量名 in

“值1”)

如果变量值等于值1,则执行程序1

;;

“值2”)

如果变量的值等于值2,则执行程序2

;;

*)

如果变量的值不是以上的值,则执行此程序

;;

esac

应用实例

case $1 in
"1")
echo "周一"
;;
"2")
echo "周二"
;;
*)
echo "other"
;;
esac

运行结果

(base) [root@VM_0_17_centos home]# ./liu.sh 2
周二

10.3 for 循环

基本语法

for 变量 in 值1 值2 值3 …

do

​ 程序

done

或者

for ((初始值;循环控制条件;变量变化))

do

​ 程序

done

应用实例

for i in "$*"
 do
   echo "the num is $i"
done

echo "===================="
Sum=0
for (( i=1;i<=100;i++))
 do
      Sum=$[$Sum + $i]
  done
echo "sum=$Sum"

运行结果:

(base) [root@VM_0_17_centos home]# ./liu.sh 1 2 3 4
the num is 1 2 3 4
====================
sum=5050
10.4 while 循环

基本语法

while [ 条件判断式 ]

do

​ 程序

done

应用实例

SUM=0
i=0
while [ $i -le $1 ]
 do
 SUM=$[ $SUM + $i ]
 i=$[ $i + 1 ]

 done
 echo "sum=$SUM"

运行结果

(base) [root@VM_0_17_centos home]# ./liu.sh 100
sum=5050

11.read读取控制台输入

基本语法

read(选项)(参数)

选项:

-p:指定读取值时的提示符;-t:指定读取时等待时间

变量:指定读取值得变量名

应用实例

read -p "请输入一个数num1=" NUM1
echo "num1=$NUM1"
read -t 10 -p "请输入一个数num2=" NUM2
echo "num2=$NUM2"

运行结果

(base) [root@VM_0_17_centos home]# ./liu.sh
请输入一个数num1=1
num1=1
请输入一个数num2=5
num2=5

12.函数

shell编程和其他编程语言一样,有系统函数,有可以自定义函数。

系统函数:

basename基本语法:

功能:返回完整路径最后 / 的部分,常用于获取文件名

basename [pathname] [suffix] (功能描述:basename命令会删除所有的前缀包括最后一个(‘/’))字符,然后将字符显示出来。

dirname基本语法

功能:返回完整路径最后 / 的前面的部分,常用于返回路径部分

应用实例:

(base) [root@VM_0_17_centos dir1]# basename /home/dir1/home
home
(base) [root@VM_0_17_centos dir1]# dirname /home/dir1/home
/home/dir1

自定义函数

基本语法

[ function ] funname[0]

{

Action

[ return int;]

}

应用实例

function getSum(){
         Sum=$[ $n1+$n2 ]
         echo "和是=$Sum"
}
read -p "请输入一个数n1:" n1
read -p "请输入一个数n2:" n2

#调用getSum
getSum $n1 $n2

运行结果

(base) [root@VM_0_17_centos home]# ./liu.sh
请输入一个数n1:5
请输入一个数n2:6
和是=11

13.shell编程综合应用

#!/bin/bash

#完成数据库的定时备份。
#备份的路径
BACKUP=/home/liu1
#当前的时间作为文件名
DATETIME=$(date +%Y_%m_%d_%H%M%S)
#可以输出变量调试
#echo ${DATETIME}

echo "=======开始备份========"
echo "=======备份的路径是 $BACKUP/$DATETIME.tar.gz"

#主机
HOST=VM_0_17_centos
#用户名
DB_USER=root
#密码
DB_PWD=962831000hjw.
#备份数据库名
DATABASE=/home/111.txt
#创建备份的路径
#如果备份的路径文件夹存在,就使用,否则就创建
[ ! -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 "=====备份文件成功==========="

运行结果:

(base) [root@VM_0_17_centos home]# cd /home/liu1
(base) [root@VM_0_17_centos liu1]# ll
total 12
-rw-r--r-- 1 root root 179 Nov  4 13:27 2019_11_04_132725.tar.gz
-rw-r--r-- 1 root root 179 Nov  4 13:30 2019_11_04_133025.tar.gz
-rw-r--r-- 1 root root 181 Nov  4 13:38 2019_11_04_133812.tar.gz

你可能感兴趣的:(centos)