Shell编程快速入门

目录

一. 为什么学习Shell编程

二. Shell是什么

三. Shell脚本的执行方式

1、脚本格式要求

2、编写第一个Shell脚本

3、脚本的常用执行方式

四. Shell的变量

1、介绍

 2、shell变量的定义

3、shell变量定义规则

4、将命令的返回值赋给变量

五. 设置环境变量 

1、基本语法

2、快速入门

六. 位置参数变量

1、介绍

2、基本语法

3、位置参数变量

七. 预定义变量

1、基本介绍

2、基本语法

3、应用实例

八. 运算符

1、基本介绍

2、基本语法

3、应用实例oper.sh

九. 条件判断

1、判断语句

十. 流程控制

1、if判断

2、case语句

 3、for循环

4、while循环

十一. read读取控制台输入

1、基本语法

2、应用实例 testRead.sh

十二. 函数

1、介绍

2、系统函数

3、自定义函数

 十三. Shell编程综合案例

1、需求分析


一. 为什么学习Shell编程

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

        2、对于JavaEE和Python程序员来说,工作需要可能要求会编写一些Shell脚本进行程序或者服务器的维护,比如编写一个定时备份数据库的脚本。

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

二. Shell是什么

        Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序。看一个示意图

三. Shell脚本的执行方式

1、脚本格式要求

  • 脚本以 #!/bin/bash 开头
  • 脚本需要有可执行权限

2、编写第一个Shell脚本

        案例:创建一个Shell脚本,输出hello world!

//执行命令
vim hello.sh

//文档内容
#!/bin/bash
echo "hello,world!"

3、脚本的常用执行方式

        (1)输入脚本的绝对路径或相对路径

                首先要赋予hello.sh 脚本的+x 权限( chmod u+x hello.sh,再执行脚本

                如:./hello.sh 或者使用绝对路径 /root/shcode/hello.sh

        (2)sh+脚本

                不用赋予脚本+x权限,直接执行即可。 

                如:sh hello.sh (也可以使用绝对路径)

四. Shell的变量

1、介绍

  • Linux Shell中的变量分为,系统变量和用户自定义变量。
  • 系统变量:$HOME、$PWD、$SHELL 、$USER等等,比如: echo $HOME
  • 显示当前shell中所有变量:set    

 2、shell变量的定义

  • 语法

        定义变量: 变量名=值

        撤销变量: unset 变量名

        声明静态变量:readonly 变量   

定义变量时,=前后不要加空格

静态变量不能unset撤销

  •  快速入门
#!/bin/bash

#案例1:定义变量A
A=100

#输出变量需要加上$,以下两种输出一样的
echo A=$A
echo "A=$A"

#案例2:撤销变量A
unset A
echo "A=$A"

#案例3:声明静态的变量B=2,不能unset
readonly B=2
echo "B=$B"

#将指令返回的结果赋给变量,虽然两种结果一样,但是更推荐$()形式,它有更好的可读性和嵌套命令的支持
:<<!
C=`date`
D=$(date)
echo "C=$C"
echo "D=$D"
!

#使用环境变量TOMCATE_HOME
echo "tomcat_home=$TOMCAT_HOME"

 :<<!  内容  !       这个是shell脚本的多行注释

可以把变量提升为全局环境变量,可供其他shell程序使用【后续说】

3、shell变量定义规则

  • 变量名称可以由字母、数字和下划线组成,但是不能以数字开头。5A=200 这种定义是错的。
  • 等号两侧不能有空格
  • 变量名称一般习惯为大写,这是一个规范,遵守即可。

4、将命令的返回值赋给变量

  • A=`date` 反引号,运行里面的命令,并把结果返回给变量A
  • A=$(date) 等价于反引号

五. 设置环境变量 

1、基本语法

  • export 变量名=变量值        (将shell变量输出为环境变量/全局变量)
  • source 配置文件                (让修改后的配置信息立即生效)
  • echo $变量名                     (查询环境变量的值)       

环境变量可以理解为全局变量,在不同的脚本中都能使用,属于一个公共的全局的变量 

2、快速入门

1)在/etc/profile文件中定义TOMCAT_HOME环境变量

2)查看环境变量TOMCAT_HOME的值

3)在另外一个shell程序中使用TOMCAT_HOME

        注意:在输出TOMCAT_HOME环境变量前,需要让其生效

        source /etc/profile

六. 位置参数变量

1、介绍

        当我们执行一个shell脚本时,如果希望获取到命令行的参数信息,就可以使用到位置参数变量

        比如:./myshell.sh 100 200  这个就是一个执行shell的命令行,可以在myshell脚本中获取到参数信息。

2、基本语法

  • $n        (n为数字,$0代表命令本身,$1-$9代表第一到第九个参数,十以上的参数需要用大括号包含,如${10}) 
  • $*        (这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体)
  • $@      (这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待)
  • $#        (这个变量代表命令行中所有参数的个数)

3、位置参数变量

        案例:编写一个shell脚本 position.sh,在脚本中获取到命令行的各个参数信息

#!/bin/bash
echo "$1 $2 $3"
echo "所有的参数=$*"
echo "$@"
echo "参数的个数=$#"

        执行结果如下:

七. 预定义变量

1、基本介绍

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

2、基本语法

  • $$        (当前进程的进程号PID)
  • $!           (后台运行的最后一个进程的进程号PID)
  • $?          (最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。)        

3、应用实例

        在一个shell脚本中简单使用以下预定义变量

        preVar.sh

#!/bin/bash
echo "当前执行的进程id=$$"
#以后台的方式运行一个脚本,并获取他的进程号
/root/shcode/myshell.sh &
echo "最后一个后台方式运行的进程id=$!"
echo "执行的结果是=$?"

八. 运算符

1、基本介绍

        学习如何在shell中进行各种运算操作

2、基本语法

  • "$((运算式))" 或 “$[运算式]" 或 expr m+n //expression 表达式
  • 注意expr运算符间要有空格,如果希望将expr的结果赋给某个变量,使用``
  • expr m - n
  • expr \*,/,%        乘(需要转义),除,取余        

3、应用实例oper.sh

        案例1:计算(2+3)x4的值

        案例2:请求出命令行的两个参数[整数]的和 20 50

#!/bin/bash
#案例1:计算(2+3)x 4的值

#使用第一种方式
RES1=$(((2+3)*4))
echo "res1=$RES1"

#使用第二种方式,推荐使用
RES2=$[(2+3)*4]
echo "res2=$RES2"

#使用第三种方式expr
TEMP=`expr 2 + 3`
RES4=`expr $TEMP \*4`
echo "temp=$TEMP"
echo "res4=$RES4"

#案例2:请求出命令行的两个参数[整数]的和 20 50
SUM=$[$1+$2]
echo "sum=$SUM"

第一、二种方式,不需要空格,乘法*也不需要转义。只有第三种expr方式才需要 

九. 条件判断

1、判断语句

  • 基本语法         

        [ condition ]        (注意condition前后要有空格)

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

  • 应用实例        

        [ esther ]        返回true

        [ ]         返回false(即便是空,也需要加空格)

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

  • 判断语句        

        常用判断条件

        (1)= 字符串比较

        (2)两个整数的比较

                -lt        小于

                -le        小于等于little equal

                -eq        等于

                -gt        大于

                -ge        大于等于

                -ne        不等于

        (3)按照文件权限进行判断

                -r         有读的权限

                -w        有写的权限

                -x        有执行的权限

        (4)按照文件类型进行判断

                -f         文件存在并且是一个常规的文件

                -e        文件存在

                -d        文件存在并是一个目录 

  • 应用实例        

        案例1:“ok”是否等于“ok”

        判断语句:使用 =

        案例2:23是否大于等于22

        判断语句:使用 -ge

        案例3:/root/shcode/aaa.txt目录中的文件是否存在

        判断语句:使用-f

        代码如下:

#!/bin/bash
#案例1:"ok"是否等于"ok"
#判断语句:使用 =
if [ "ok" = "ok" ]
then
    echo "equal"
fi

#案例2:23是否大于等于22
#判断语句:使用 -ge
if [ 23 -ge 22 ]
then
    echo "大于"
fi

#案例3:/root/shcode/aaa.txt
if [ -f /root/shcode/aaa.txt ]
then
    echo "存在”
fi

#看几个案例
if [ esther ]
then
    echo "hello,esther"
fi

十. 流程控制

1、if判断

  • 基本语法         

        if [ 条件判断式 ]

        then

        代码

        fi

        或者,多分支

        if [ 条件判断式 ]

        then

        代码

        elif [ 条件判断式 ]

        then

        代码

        fi

  • 注意事项: [ 条件判断式 ],中括号和条件判断式之间必须有空格
  • 应用实例 ifCase.sh         

        案例:请编写一个shell程序,如果输入的参数,大于等于60,则输出“及格了”,如果小于60,则输出“不及格”

#!/bin/bash
#案例:请编写一个shell程序,如果输入的参数,大于等于60,则输出“及格了”,否则输出“不及格”
if [ $1 -ge 60]
then
    echo "及格了"
elif [ $1 -lt 60 ]
    echo "不及格"
fi

2、case语句

  • 基本语法         

        case $变量名 in

        "值1")

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

        ;;

        "值2")

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

        ;;

        ...省略其他分支...

        *)

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

        ;;

        esac

  • 应用实例 testCase.sh        
#!/bin/bash
#案例1:当命令行参数是1时,输出"周一",是2时,就输出"周二",其它情况输出"other"
case $1 in
"1")
echo "周一"
;;
"2")
echo "周二"
;;
*)
echo "other..."
;;
esac

 3、for循环

  • 基本语法 1       

        for 变量 in 值1 值2 值3...

        do

        程序/代码

        done

        应用实例 testFor1.sh

        案例1:打印命令行输入的参数 [这里可以看出$*和$@的区别]

  • 基本语法2         

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

        do

        程序/代码

        done

  • 应用实例 testFor2.sh         

        案例1:从1到100的值输出显示

#!/bin/bash
#案例1:打印命令行输入的参数 [这里可以看出$* 和 $@的区别]
#注意 $* 是把输入的参数,当做一个整体,所以,只会输出一句
for i in "$*"
do
    echo "num is $i"
done
#使用 $@来获取输入的参数,注意,这时是分别对待,所以有几个参数,就输出几个参数
echo "=============================="
for j in "$@"
do
    echo "num is $j"
done
#!/bin/bash
#案例1:从1加到100的值输出显示,如何把100做成一个变量
#定义一个变量 SUM
SUM=0
for(( i=1; i<=$1; i++))
do
#写上你的业务代码
SUM=$[$SUM+$i]
done
echo "总和SUM=$SUM"

4、while循环

  • 基本语法 1         

        while [  条件判断式 ] 

         do

        程序 /代码

        done

        注意:while 和 [有空格,条件判断式和 [ 也有空格

  • 应用实例testWhile.sh        
#!/bin/bash
#案例1:从命令行输入一个数n,统计从1+...+n的值是多少?
SUM=0
i=0
while [ $i -le $1 ]
do
    SUM=$[$SUM+$i]
    #i 自增
    i=$[$i+1]
done
echo "执行结果=$SUM"

十一. read读取控制台输入

1、基本语法

        read(选项)(参数)

        选项:

                -p        指定读取值时的提示符;

                -t        指定读取值时等待的时间(秒),如果没有在指定的时间内输入,就不再等待了。

        参数:

                变量        指定读取值的变量名

2、应用实例 testRead.sh

#!/bin/bash
#案例1:读取控制台输入一个NUM1值
read -p"请输入一个数 NUM1=" NUM1
echo "你输入的NUM1=$NUM1"

#案例2:读取控制台输入一个NUM2值,在10秒内输入
read -t 10 -p "请输入一个数NUM2=" NUM2
echo "你输入的NUM2=$NUM2"

十二. 函数

1、介绍

        shell编程和其它编程语言一样,有系统函数,也可以自定义函数。系统函数中,我们这里就介绍两个。

2、系统函数

  • basename基本语法         

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

        basename [pathname] [suffix]

        basename [string] [suffix]        basename命令会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来。

        选项:

        siffix为后缀,如果suffix被指定了,basename会将pathname或string中的suffix去掉

  • 应用实例         

        案例1:请返回 /home/aaa/test.txt 的 "text.txt"部分

        basename /home/aaa/test.txt

  • dirname 基本语法

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

        dirname 文件绝对路径        (从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分))

  • 应用实例         

        案例1:请返回 /home/aaa/test.txt 的 "test.txt"部分

        basename /home/aaa/test.txt 

3、自定义函数

  • 基本语法        

        [ function ] funname[()]

        {

             Action;

             [return int;]

         }

        调用直接写函数名:funname [值]

  • 应用实例            
#!/bin/bash
#案例1:计算输入两个参数的和(动态的获取),getSum

#定义函数getSum
function getSum(){
    SUM=$[$n1+$n2]
    echo "和是=$SUM"
}

#输入两个值
read -p "请输入一个数n1=" n1
read -p "请输入一个数n2=" n2
#调用自定义函数
getSum $n1 $n2

 十三. Shell编程综合案例

1、需求分析

(1)每天凌晨2:30备份数据库hspedu到 /data/backup/db

(2)备份开始和备份结束能够给出相应的提示信息

(3)备份后的文件要求以备份时间为文件名,并打包成.tar.gz的形式,比如:2025-01-15_250115.tar.gz

(4)在备份的同时,检查是否有10天前备份的数据库文件,如果有就将其删除。

(5)思路分析图

#备份目录
BACKUP=/data/backup/db
#当前时间
DATETIME=$(date +%Y-%m-%d_%H%M%S)
echo $DATETIME
#数据库的地址
HOST=localhost
#数据库用户名
DB_USER=root
#数据库密码
DB_PW=esther100
#备份的数据库名
DATABASE=test

#创建备份目录,如果不存在,就创建
[!-d "${BACKUP}/${DATETIME}"] && mkdir -p "${BACKUP}/${DATETIME}"

#备份数据库
mysqldump -u${DB_USER} -p${DB_PW} --host=${HOST} -q -R --databases ${DATABASE} | gzip > ${BACKUP}/${DATWTIME}/$DATETIME.sql.gz

#将文件处理成tar.gz
cd ${BACKUP}
tar -zcvf$DATETIME.tar.gz ${DATETIME}

#删除对应的备份目录
rm -rf${BACKUP}/{DATETIME}

#删除10天前的备份文件
find ${BACKUP} -atime + 10 -name "*.tar.gz" -exec rm -rf{}\;
echo "备份数据库${DATABASE} 成功~"

    

                

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值