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 脚本创建:

vim demo1.sh
#!/bin/bash
#this is a shell test!
echo hello,wold!
~                 


bash  demo1.sh

shell 脚本运行:

2.2 shell脚本的执行方法 

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

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

相对路径的执行方式: 

 chmod +x  demo2.sh   //为文件增加执行权限


./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脚本执行的错误排查方法

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

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

 3.1 交互式硬件设备的介绍

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

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

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

类型 设备文件 文件描述编号 默认设备
标准输入 /dev/stdin 0 键盘
标准输出 /dev/stdout 1 显示器
标准错误输出 /dev/stderr 2 显示器

 3.2 重定向操作的符号用法

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

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

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

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

3.3.2  合并文件操作

3.3.3 重定向错误输出的运用 

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

 

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

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

3.3.5 混合输出

[root@localhost opt]#ls /opt   /xxx &>5.txt
[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]...

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

[root@localhost opt]#expr 1 +  1
2
[root@localhost opt]#expr 5 - 3
2
[root@localhost opt]#expr 3 \* 4
12
[root@localhost opt]#expr 18 /  3
6
[root@localhost opt]#expr  16 \* 3 -  22
26
[root@localhost opt]#expr  16 \* 3 -  22  + 15
41
[root@localhost opt]#expr  5 % 2
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   等等

[root@localhost opt]#let i=5+8
[root@localhost opt]#echo $i
13
[root@localhost opt]#i=1
[root@localhost opt]#let i++
[root@localhost opt]#echo $i
2
[root@localhost opt]#let i*=5
[root@localhost opt]#echo $i
10

 

4.2 小数运算 

4.2.1 bc科学计算工具的运用

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

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

4.2.2   awk命令的计算运用

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

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

[root@localhost opt]#awk "BEGIN{print 1.62*3.2}"
5.184
[root@localhost opt]#awk "BEGIN{print 11.62/3.2}"
3.63125
[root@localhost opt]#awk "BEGIN{print 11.62+3.2}"
14.82

 5.变量的运用

 5.1 普通变量的定义方法

5.1.1  命令赋值法

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

 变量名=变量值

[root@localhost opt]#name=1
[root@localhost opt]#echo $name
1
[root@localhost opt]#_yang=123
[root@localhost opt]#echo$_yang
bash: echo123: 未找到命令...
[root@localhost opt]#echo  $_yang
123
[root@localhost opt]#2a1=2
bash: 2a1=2: 未找到命令...

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

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

[root@localhost opt]#read -p :"请输入一个数值来赋予变量:"   i
:请输入一个数值来赋予变量:1
[root@localhost opt]#echo $i
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误识别。

 设置位置变量:

[root@localhost test]#vim test.sh

#!/bin/bash
#this is a test
echo ”第一个变量值为 $1:“
echo ”第二个变量值为 $2:“
echo ”第三个变量值为 $3:“
echo ”第四个变量值为 $4:“
echo ”第五个变量值为 $5:“
echo ”第六个变量值为 $6:“
echo ”第七个变量值为 $7:“
echo ”第八个变量值为 $8:“
echo ”第九个变量值为 $9:“
echo ”第十个变量值为 $10:“
                               

 

结果展示:

5.5 自定义变量

5.5.1 $0 脚本本身

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

[root@localhost test]#vim test.sh

#!/bin/bash
#this is a test
echo ”该脚本的名字为:“ $0
                              

 结果:

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

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

[root@localhost test]#vim test.sh 

#!/bin/bash
#this is a test
echo  ”定义的变量有“ $@
echo  "定义的变量有" $* 
                                     

 

测试结果:

 

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

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

[root@localhost test]#vim test.sh 

#!/bin/bash
#this is a test
echo  "定义的变量有:"  
for i  in "$*"
do

echo $i
done
echo  "定义的变量有:"  
for i  in "$@"
do

echo $i
done
                    

 

测试结果:

5.5.3 $? 的作用

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

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

 6.扩展延伸

 6.1 date命令的运用

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

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

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

[root@localhost test]#date +"%Y%m%d"
20220823
[root@localhost test]#date -d "-1 day" +"%Y%m%d"
20220822
[root@localhost test]#date -d "+1 day" +"%Y%m%d"
20220824
[root@localhost test]#date +"%Y%m01"
20220801
[root@localhost test]#date -d "+1 month" +"%Y%m01"
20220901
[root@localhost test]#
[root@localhost test]#date -d "$(date -d "next-month" +"%Y%m01") -1 day" +"%Y%m%d"
20220831
[root@localhost test]#date -d "$(date +"%Y%m01") -1 day" +"%Y%m%d"
20220731

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

[root@localhost test]#vim test2.sh

#!/bin/bash


BACKUP=backupfiles-$(date +%Y%m%d).tar.gz

tar zcvf  $BACKUP  $* &> /dev/null

echo -n "已执行 $0 的脚本"
echo -n "共压缩 $# 的文件"
echo "被压缩的文件有:$@" 
               

 

执行结果:

 总结

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

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

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

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习编程?其实不难,不过在学习编程之前你得先了解你的目的是什么?这个很重要,因为目的决定你的发展方向、决定你的发展速度。
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面设计类、前端与移动、开发与测试、营销推广类、数据运营类、运营维护类、游戏相关类等,根据不同的分类下面有细分了不同的岗位。
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生学习Java开发,但要结合自身的情况,先了解自己适不适合去学习Java,不要盲目的选择不适合自己的Java培训班进行学习。只要肯下功夫钻研,多看、多想、多练
Can’t connect to local MySQL server through socket \'/var/lib/mysql/mysql.sock问题 1.进入mysql路径
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 sqlplus / as sysdba 2.普通用户登录
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服务器有时候会断掉,所以写个shell脚本每五分钟去判断是否连接,于是就有下面的shell脚本。
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
假如你已经使用过苹果开发者中心上架app,你肯定知道在苹果开发者中心的web界面,无法直接提交ipa文件,而是需要使用第三方工具,将ipa文件上传到构建版本,开...
下面的 SQL 语句指定了两个别名,一个是 name 列的别名,一个是 country 列的别名。**提示:**如果列名称包含空格,要求使用双引号或方括号:
在使用H5混合开发的app打包后,需要将ipa文件上传到appstore进行发布,就需要去苹果开发者中心进行发布。​
+----+--------------+---------------------------+-------+---------+
数组的声明并不是声明一个个单独的变量,比如 number0、number1、...、number99,而是声明一个数组变量,比如 numbers,然后使用 nu...
第一步:到appuploader官网下载辅助工具和iCloud驱动,使用前面创建的AppID登录。
如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):
前不久在制作win11pe,制作了一版,1.26GB,太大了,不满意,想再裁剪下,发现这次dism mount正常,commit或discard巨慢,以前都很快...
赛门铁克各个版本概览:https://knowledge.broadcom.com/external/article?legacyId=tech163829
实测Python 3.6.6用pip 21.3.1,再高就报错了,Python 3.10.7用pip 22.3.1是可以的
Broadcom Corporation (博通公司,股票代号AVGO)是全球领先的有线和无线通信半导体公司。其产品实现向家庭、 办公室和移动环境以及在这些环境...
发现个问题,server2016上安装了c4d这些版本,低版本的正常显示窗格,但红色圈出的高版本c4d打开后不显示窗格,
TAT:https://cloud.tencent.com/document/product/1340