• shell脚本的编写规范和变量类型


    内容预知

    1.shell的作用与shell脚本的场景运用

     1.1 shell的作用

    1.2 常见的shell解释器

     1.3 shell 脚本的用途和应用场景

     2.shell脚本的编写规范和执行方法

    2.1 shell脚本的编写规范 

    2.2 shell脚本的执行方法 

     2.2.1 用指定路径方式去执行文件

    2.2.2 使用解释器名称直接使用脚本

     2.2.3 “.”和source 启动脚本

    2.3 shell脚本执行方法的区别 

    2.4  shell脚本执行的错误排查方法

    3.重定向与管道的作用和使用方法

     3.1 交互式硬件设备的介绍

     3.2 重定向操作的符号用法

     3.3 交互硬件设备和重定向符合的运用演示

    3.3.1 标准输入,重定向输出,重定向输入的搭配运用

    3.3.2  合并文件操作

    3.3.3 重定向错误输出的运用 

    3.3.4 重定向错误输出的第二种表示方法 

    3.3.5 混合输出

    3.5 管道符的运用

     4.数值运算的方法

     4.1 整数运算

    4.1.1 expr 的运用 

    4.1.2   echo$[ ]和echo $(( ))

    4.1.3  let的运用 

    4.2 小数运算 

    4.2.1 bc科学计算工具的运用

    4.2.2   awk命令的计算运用

     5.变量的运用

     5.1 普通变量的定义方法

    5.1.1  命令赋值法

    5.1.2  通过标准输入来定义变量

    5.1.3 普通变量的全局设置和局部设置

    5.2 环境变量 

    5.2.1 变量的范围划分

    5.2.2 查看所有的环境变量

    5.2.3 环境变量的特性

    5.2.4 环境变量的配置文件 

     

    5.3 只读变量

    5.4 位置变量 

    5.5 自定义变量

    5.5.1 $0 脚本本身

    5.5.2  $* $@  脚本后面跟的所有参数

    5.5.3 $? 的作用

     6.扩展延伸

     6.1 date命令的运用

    6.2 本文所有内容写一个简易的用于压缩的脚本

     总结


    1.shell的作用与shell脚本的场景运用

     1.1 shell的作用

     shell是Linux系统中后台运行的一种特殊程序也可以理解 成一种特殊的软件,提供了用户与内核进行交互操作的 一种接口。(简单的说就是shell把人类的高级语言转换成二进制数据,让机器明白你的指令)

     过程:用户发出指令,通过shell转换成二进制语言被内核识别,内核再调度相对应的硬件,做出相关操作。

    1.2 常见的shell解释器

    cat  /etc/shells      //linux中查看本机shell种类

     

    • bash:基于GUN的框架下发展的shell
    • csh:类似C语言的shell
    • tcsh:整合了csh 提供了更多功能
    • sh:已经被bash替换
    • nologin:让用户无法登录

    bash(/bin/bash)是目前大多数 Linux 版本采用的默认 shell。

    其中bsh的特性:

    1. 支持快捷键:比如 ctrl+c 强制终止进程 、 ctrl+l 清屏 、Tab补齐 等等。
    2. 支持查看历史命令(history)
    3. 支持别名(alias)
    4. 标准输入和标准输出的重定向
    5. 管道符
    6. 文件名通配机制
    7. 支持命令hash
    8. 支持变量

     1.3 shell 脚本的用途和应用场景

    用途:

    • 自动化常用命令
    • 执行系统管理和故障排除
    • 创建简单的应用程序
    • 处理文本或文件

    应用场景:

    • 重复性操作
    • 交互性任务
    • 批量事务处理
    • 服务运行状态监控
    • 定时任务执行

     2.shell脚本的编写规范和执行方法

    2.1 shell脚本的编写规范 

     脚本的命名规范:都是基本名称,以“.bash”为结尾。

    脚本代码开头一些规范化:

    必备: 

    1. 第一行一般为调用使用的语言
    2. 程序名,避免更改文件名后无法找到正确的文件

    注释信息:

    1. 版本号
    2. 更改后的时间
    3. 作者相关信息
    4. 该程序的作用,及注意事项

    shell 脚本创建:

    1. vim demo1.sh
    2. #!/bin/bash
    3. #this is a shell test!
    4. echo hello,wold!
    5. ~
    6. bash demo1.sh

    shell 脚本运行:

    2.2 shell脚本的执行方法 

     2.2.1 用指定路径方式去执行文件

     指定路径方式执行有两种,一种是绝对路径的方式去执行,一种是相对路径的方式去执行(但是执行的前提一定是该脚本文件拥有执行的权限!

    相对路径的执行方式: 

    1. chmod +x demo2.sh //为文件增加执行权限
    2. ./demo2.sh //相对路径方式进行执行

     

    绝对路径的执行方式:

    /root/demo2.sh   // 绝对路径的运行方式

    2.2.2 使用解释器名称直接使用脚本

     我们在shel脚本中的第一行就声明了/bin/bash 解释器的存在。此时即便该脚本没有执行权限,我们也可以通过  bash   脚本名称  进行执行

    bash  demo3.sh

     

     2.2.3 “.”和source 启动脚本

    source  test.bash    或    .  test.sh

    2.3 shell脚本执行方法的区别 

    脚本中的shell环境:指定路径(相对路径和绝对路径执行)和bash执行

    当前shell环境中的执行方法:“.”和sourece  

     

    2.4  shell脚本执行的错误排查方法

    1. bash -n 脚本名称 //只检查语法错误,不真正执行脚本。定位的错误行可能不准确。
    2. bash -x 脚本名称 //显示每个命令的执行过程,方便发现逻辑错误

    3.重定向与管道的作用和使用方法

     3.1 交互式硬件设备的介绍

                           标准输入:从该设备中接收用户通过键盘输入的信息

    标准输出:通过该设备向用户输出数据

               标准错误输出:通过该设备报告执行出错信息

    类型设备文件文件描述编号默认设备
    标准输入/dev/stdin0键盘
    标准输出/dev/stdout1显示器
    标准错误输出/dev/stderr2显示器

     3.2 重定向操作的符号用法

    类型操作符用途
    重定向输入<从指定的文件中读取数据,不是从键盘输入读取
    重定向输出>将输出的结果保存在指定的文件中(覆盖原文件)
    >>将输出的结果追加在指定文件的末尾
    重定向错误输出2>将错误信息保存在指定的文件(覆盖原文件内容)
    2>>将错误信息追加在指定文件的末尾
    混合输出&>将标准输出和标准错误信息都保存在同一个文件中

     3.3 交互硬件设备和重定向符合的运用演示

    3.3.1 标准输入,重定向输出,重定向输入的搭配运用

    1. [root@localhost boot]#useradd lisi
    2. [root@localhost boot]#echo '12345'>1.txt
    3. [root@localhost boot]#cat 1.txt
    4. 12345
    5. [root@localhost boot]#passwd --stdin lisi <1.txt
    6. 更改用户 lisi 的密码 。
    7. passwd:所有的身份验证令牌已经成功更新。
    8. [root@localhost boot]#id lisi
    9. uid=1001(lisi) gid=1001(lisi) 组=1001(lisi)
    10. [root@localhost boot]#tail -n 2 /etc/passwd
    11. zhangsan:x:1000:1000:zhangsan:/home/zhangsan:/bin/bash
    12. lisi:x:1001:1001::/home/lisi:/bin/bash

    3.3.2  合并文件操作

    3.3.3 重定向错误输出的运用 

    1. [root@localhost opt]#ls abc 2>4.txt
    2. [root@localhost opt]#cat 4.txt

     

    3.3.4 重定向错误输出的第二种表示方法 

    1. [root@localhost opt]#ls abc >123.txt 2>&1
    2. [root@localhost opt]#cat 123.txt

    3.3.5 混合输出

    1. [root@localhost opt]#ls /opt /xxx &>5.txt
    2. [root@localhost opt]#cat 5.txt

    3.5 管道符的运用

     管道符的作用是连接两个命令,将第一个命令的标准输出作为第二个命令的标准输入。 同一行命令中可以使用多个管道符。(管道符的使用前提,一定是管道符前面的命名有输出结果,后面的命令是搭配着输出结果进行操作)

    另外:如果管道符符合右边一定要执行对象的命令,则管道符后面要有xargs命令来执行传递参数。 

    [root@localhost opt]#ss -ntlp|grep 22
    

     

     4.数值运算的方法

     4.1 整数运算

    4.1.1 expr 的运用 

    格式:expr 数值1  运算符 数值2 [运算符 数值3]...

    运算符:+(加)        -  (减)    \ * (乘 以)    /(除于)   %( 取余 (取模))

    1. [root@localhost opt]#expr 1 + 1
    2. 2
    3. [root@localhost opt]#expr 5 - 3
    4. 2
    5. [root@localhost opt]#expr 3 \* 4
    6. 12
    7. [root@localhost opt]#expr 18 / 3
    8. 6
    9. [root@localhost opt]#expr 16 \* 3 - 22
    10. 26
    11. [root@localhost opt]#expr 16 \* 3 - 22 + 15
    12. 41
    13. [root@localhost opt]#expr 5 % 2
    14. 1

     

    4.1.2   echo$[ ]和echo $(( ))

    格式:

     echo  $((数值 运算符 数值))
     echo $[数值 运算符 数值]

    运算符:+(加)   -(减)   *(乘以)     /(除于 )      %(取余)

     

    4.1.3  let的运用 

    格式:let 变量=<数值>运算符<数值> 

     运算符与echo $[ ]相同

    除此之外:

    与java,c语言等计算机语言的整数变量用法相似,有

    let i++     let i--    let i+=2    let i*=2   等等

    1. [root@localhost opt]#let i=5+8
    2. [root@localhost opt]#echo $i
    3. 13
    4. [root@localhost opt]#i=1
    5. [root@localhost opt]#let i++
    6. [root@localhost opt]#echo $i
    7. 2
    8. [root@localhost opt]#let i*=5
    9. [root@localhost opt]#echo $i
    10. 10

     

    4.2 小数运算 

    4.2.1 bc科学计算工具的运用

    Bash内置了对整数运算的支持,但是并不支持浮点运算,而 bc 计算器可以很方便的进行浮点运算。

    • 支持交互式和非交互式两种方式。
    • 使用scale=n可以指定精度,即小数点后的位数。要写在算术表达式之前。
    1. [root@localhost opt]#echo "1.1+1.1"|bc
    2. 2.2
    3. [root@localhost opt]#echo "13.1-5.6"|bc
    4. 7.5
    5. [root@localhost opt]#echo "scale=5;13.1*5.6"|bc
    6. 73.36
    7. [root@localhost opt]#echo "scale=5;13.14*5.64"|bc
    8. 74.1096

    4.2.2   awk命令的计算运用

    使用awk进行浮点数的运算,运算结果最多只保留到小数点的后五位。

    式:awk "BEGIN{print 算术表达式}"

    1. [root@localhost opt]#awk "BEGIN{print 1.62*3.2}"
    2. 5.184
    3. [root@localhost opt]#awk "BEGIN{print 11.62/3.2}"
    4. 3.63125
    5. [root@localhost opt]#awk "BEGIN{print 11.62+3.2}"
    6. 14.82

     5.变量的运用

     5.1 普通变量的定义方法

    5.1.1  命令赋值法

    注意:定义变量时,变量名只能是由以"_"为开头第一个字符,或者是以字母为开头才可能生效使用

     变量名=变量值

    1. [root@localhost opt]#name=1
    2. [root@localhost opt]#echo $name
    3. 1
    4. [root@localhost opt]#_yang=123
    5. [root@localhost opt]#echo$_yang
    6. bash: echo123: 未找到命令...
    7. [root@localhost opt]#echo $_yang
    8. 123
    9. [root@localhost opt]#2a1=2
    10. bash: 2a1=2: 未找到命令...

    5.1.2  通过标准输入来定义变量

     格式:read 获取标准输入的内容给 变量

    1. [root@localhost opt]#read -p :"请输入一个数值来赋予变量:" i
    2. :请输入一个数值来赋予变量:1
    3. [root@localhost opt]#echo $i
    4. 1

    5.1.3 普通变量的全局设置和局部设置

     如果只是简单的 变量名=变量值  设置的是局部变量,只对当前shell环境生效

    export  变量=变量  设置的是全局变量,对所有的shell环境均生效

     

    注意:变量如果不添加到配置文件中都是暂时的

    5.2 环境变量 

    5.2.1 变量的范围划分

    • 环境变量(全局变量):全局生效,在任何bash环境中都可以识别。

    • 局部变量:生效范围为当前shell进程。对当前shell之外的其它shell进程,包括当前shell的子shell进程均无效。

    • 本地变量:生效范围为当前shell进程中某代码片断,通常指函数。 只能在定义它们的函数/脚本内部中使用。

    5.2.2 查看所有的环境变量

    env

    其中用处最为广泛的环境变量为

    • $PATH 表示可执行文件的默认路径
    • $USER 表示用户名称
    • $HOME 表示用户的宿主目录
    • $LANG 表示语言和字符集
    • $PWD 表示当前所在工作目录

     

     

    5.2.3 环境变量的特性

    • 可以使子进程(包括孙子进程)继承父进程的变量,但是无法让父进程使用子进程的变量。
    • 一旦子进程修改从父进程继承的变量,将会新的值传递给孙子进程。
    • 一般只在系统配置文件中使用,在脚本中较少使用。

    5.2.4 环境变量的配置文件 

    全局配置文件:

    • /etc/profile,修改此文件会作用于所有用户。

    用户独立的配置文件:

    • ~/.bash_profile,修改这个文件只作用于当前用户。

     

    5.3 只读变量

    只读变量,是一开始设置好的变量数值,一旦设置便无法更改或者删除(没有添加到配置中,则是重启后失效,添加后永久保存。或者清除配置中的设置,再重启清除)

    格式 :  readonly  变量名=变量值

     

    5.4 位置变量 

     位置变量是$后以数字为结尾的的变量代表着每一个变量和标准输入参数的位置。(数字是以1为开头。1-9是正常跟在$后面即可。当数字大于或等于10,要用{ }进行使用,区别shell误识别。

     设置位置变量:

    1. [root@localhost test]#vim test.sh
    2. #!/bin/bash
    3. #this is a test
    4. echo ”第一个变量值为 $1:“
    5. echo ”第二个变量值为 $2:“
    6. echo ”第三个变量值为 $3:“
    7. echo ”第四个变量值为 $4:“
    8. echo ”第五个变量值为 $5:“
    9. echo ”第六个变量值为 $6:“
    10. echo ”第七个变量值为 $7:“
    11. echo ”第八个变量值为 $8:“
    12. echo ”第九个变量值为 $9:“
    13. echo ”第十个变量值为 $10:“

     

    结果展示:

    5.5 自定义变量

    5.5.1 $0 脚本本身

     在定义位置变量时,我们取数值是从1开始的,另外10以上数值要用${10}表示的原因就是因为bash脚本中默认定义了$0为脚本本身的名字。

    1. [root@localhost test]#vim test.sh
    2. #!/bin/bash
    3. #this is a test
    4. echo ”该脚本的名字为:“ $0

     结果:

    5.5.2  $* $@  脚本后面跟的所有参数

     正常情况下$@和$*是同一个作用 将输入的参数当作是一个整体,一次性输出

    1. [root@localhost test]#vim test.sh
    2. #!/bin/bash
    3. #this is a test
    4. echo ”定义的变量有“ $@
    5. echo "定义的变量有" $*

     

    测试结果:

     

     但是在有双引号中,则作用便不相同:

    "$*"  会把脚本后面跟的所有参数当作一个整体看待
    "$@"  会把脚本后面跟的所有参数看作多个以空格分隔的个体

    1. [root@localhost test]#vim test.sh
    2. #!/bin/bash
    3. #this is a test
    4. echo "定义的变量有:"
    5. for i in "$*"
    6. do
    7. echo $i
    8. done
    9. echo "定义的变量有:"
    10. for i in "$@"
    11. do
    12. echo $i
    13. done

     

    测试结果:

    5.5.3 $? 的作用

     $? 可以用来获取上一条命令的返回值,如果将获取返回值的信息转化输出为"0",则表示上一条命令执行成功。如果获取的为非"0"的值,上一条命令执行异常。

    1. [root@localhost test]#ss -ntlp|grep httpd
    2. [root@localhost test]#echo $?
    3. 1
    4. [root@localhost test]#ss -ntlp|grep 53
    5. LISTEN 0 5 192.168.122.1:53 *:* users:(("dnsmasq",pid=1315,fd=6))
    6. [root@localhost test]#echo $?
    7. 0

     6.扩展延伸

     6.1 date命令的运用

    date默认情况下,用来查看时间日期

    另外定义格式:      date +"%Y%m%d"

     %Y    年份       %d    按月计的日期(例如:01)      %d    按月计的日期(例如:01)

    1. [root@localhost test]#date +"%Y%m%d"
    2. 20220823
    3. [root@localhost test]#date -d "-1 day" +"%Y%m%d"
    4. 20220822
    5. [root@localhost test]#date -d "+1 day" +"%Y%m%d"
    6. 20220824
    7. [root@localhost test]#date +"%Y%m01"
    8. 20220801
    9. [root@localhost test]#date -d "+1 month" +"%Y%m01"
    10. 20220901
    11. [root@localhost test]#
    12. [root@localhost test]#date -d "$(date -d "next-month" +"%Y%m01") -1 day" +"%Y%m%d"
    13. 20220831
    14. [root@localhost test]#date -d "$(date +"%Y%m01") -1 day" +"%Y%m%d"
    15. 20220731

    6.2 本文所有内容写一个简易的用于压缩的脚本

    1. [root@localhost test]#vim test2.sh
    2. #!/bin/bash
    3. BACKUP=backupfiles-$(date +%Y%m%d).tar.gz
    4. tar zcvf $BACKUP $* &> /dev/null
    5. echo -n "已执行 $0 的脚本"
    6. echo -n "共压缩 $# 的文件"
    7. echo "被压缩的文件有:$@"

     

    执行结果:

     总结

     1.了解shell的作用,以及它与用户和内核之间的关于,调用过程。

    2. 掌握规范的脚本编写格式

    3. 学会使用在Linux中的运算

    4.掌握变量的定义,以及环境变量,位置变量,自定义变量。

    5.学会运用管道符和重定向符辅助日常的Linux命令,或则脚本的编写运用

    6.熟悉date 命令的一些常用日期获取

  • 相关阅读:
    centos7 install postgres-15
    kubernetes集群安装Ingress-nginx
    功能解剖学重点
    【雷达原理】雷达测距原理及实现方法
    分享|中国制造业数字化转型研究报告(附PDF)
    什么是面向对象编程
    引用参考文献[1,2]或者[1-3]
    麒麟信安受邀协办2023广电五舟行业交流大会,共建信创产业新生态
    8 个 Promise 高级用法
    HTTP协议
  • 原文地址:https://blog.csdn.net/qq_62462797/article/details/126489020