shell编程规范与变量以及运算

118 阅读6分钟

一.shell的基本概念

1.shell的作用

将要执行的命令按顺序保存到一个文本文件

给该文件可执行权限

可结合各种shell控制语句以完成更复杂的操作

2.shell脚本应用场景

  • 重复性操作

  • 交互性任务

  • 批量事务处理

  • 服务运行状态监控

  • 定时任务执行等

3.shell作用—翻译官

​ shell是一个特殊的应用程序,它介于操作系统内核和用户之间,充当了一个 “命令解释器” 的角色,负责接收用户输入的操作指令并进行解释,将需要执行的操作传递给内核执行,并输出执行结果。

4.linux中常见的shell

  • bash:基于gun的框架下发展的shell

  • csh:类似c语言的shell

  • tcsh:整合了csh提供了更多的功能

  • sh:已被bash替代

  • nologin:让用户无法登录

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

二.shell脚本

1.shell编程规范

脚本申明(解释器) :若第一行为“!/bin/bash",表示此行以下的代码语句是通过/bin/bash程序来解释执行,#!/bin/bash为默认解释器。

还有其它类型的解释器,比如# !/usr/bin/python. #! /usr/bin/expect.

注释信息:以“#"开头的语句表示为注释信息,被注释的语句在运行脚本时不会被执行。

2.shell脚本执行方法

1.绝对路径需要加执行权限

2.先对路径需要加执行权限

3.指定shell来解释脚本不需要加权限

4.使用source或. 后面跟上脚本路径不需要加权限

3.脚本的执行方式

指定路径去执行文件,文件需要有执行权限。

  • 绝对路径。如:/opt/juli.sh
  • 相对路径。如:./juli.sh

举例:

微信截图_20230809183303.png

4.指定解释器去执行(bash 脚本名),不需要执行权限

微信截图_20230809183824.png

注:执行脚本时的shell环境:

  • source和 . 执行脚本时,会在当前shell环境中执行脚本。

  • bash、绝对路径、相对路径 执行脚本时,会创建一个子shell环境,并在这个子shell环境中执行脚本。

  • 不建议使用source来执行脚本,可能会影响一些资源配置。

  • 脚本中的空白行会被解释器忽略。

  • 脚本中,除了shebang,余下所有以#开头的行,都会被视作注释行而被忽略。

5.脚本错误调试

令错误:  命令错误不会影响接下来的命令,之后的命令会继续执行。

语法错误:  会导致后续的命令不执行。造成脚本中一部分命令已执行,一部分未执行。

逻辑错误:  执行后的效果不是自己想要的,需要自己去排查。

bash -n 脚本名称     //只检查语法错误,不真正执行脚本。定位的错误行可能不准确

bash -x 脚本名称     //显示每个命令的执行过程,方便发现逻辑错误

三.重定向

1.重定向的意思就是,不通过标准输出到默认屏幕上,而是输出到你指定的位置。

交互式硬件设备

标准输入:从该设备接收用户输入的数据

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

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

微信截图_20230809184420.png

2.重定向操作

微信截图_20230809184612.png

注:

  • &表示混合,&> 和 >& 都表示将标准输出和错误输出重定向到同一个文件。
  • 命令 > 文件 2>&1,表示把错误输出2重定向给前面的标准输出1 (前面的1被省略了),即将错误输出和标准输出保存到同一个文件中。

举例:

微信截图_20230809185441.png

微信截图_20230809185956.png

四.shell脚本的变量

1.变量作用

用来存放系统和用户需要使用的特定参数(值)

变量名:使用固定的名称,由系统预设或用户定义

变量值:能够根据用户设置、系统环境的变化而变化

2.变量的分类

自定义变量:由用户自定义,修改和使用

环境变量:由系统维护,用于设置工作环境

只读变量:只可以读不可以更改

位置变量:通过命令行给脚本传递参数

预定义变量:bash中内置的一类变量,不能修改

系统内置变量:PATH、UID、HOSTNAM、USER

3.命名要求

区分大小写

不能使程序中的保留字和内置变量:如: if, for, hostname

只能使用数字、字母及下划线,且不能以数字开头,注意:不支持短横线“-",和主机名相反

不要使用内置的变量,使用英文尽量使用词义通俗易懂,PATH

下划线: student_name

4.自定义变量

格式:

  1. 变量名=变量值

  2. {} 可以定义变量的范围,确定变量的字符范围

  3. “”(双引号) 可以识别变量

  4. ' '(单引号) 不可以识别变量

  5. ``(放撇号)可以调用命令的结果作为变量值$(命令)也可以

举例1

微信截图_20230809190713.png

举例2

微信截图_20230809191110.png

举例3

微信截图_20230809191247.png

举例4

微信截图_20230809191340.png

举例5

微信截图_20230809191606.png

5.变量追加值

格式 :变量名+=追加值

举例:

微信截图_20230809192055.png

微信截图_20230809192233.png

永久设置变量:

[root@localhost ~]# vim /etc/profile #编辑配置文件

微信截图_20230809193341.png

微信截图_20230809193639.png

6.uset [变量名]

删除变量

从键盘输入内容为变量赋值

格式:read [-p "提示信息"] 变量名

示例:

微信截图_20230809192810.png

五.Shell中的算术运算

注:默认情况下bash只支持整数运算,不支持小数运算。

1.运算表达

运算表达式:

(1) expr 变量1 运算符 变量2 [运算符 变量3]...  

(2) let var=算术表达式

(3) ((var=算术表达式)),和上一个等价  

(4) var=$[算术表达式]

(5) var=$((算术表达式))

(6) var=$(expr arg1 arg2 arg3 ...)

(7) var= expr arg1 arg2 arg3 ...  

(8) echo '算术表达式' | bc

运算符

  • 加法 +
  • 减法 -
  • 乘法 \ *
  • 除法 /
  • 取余 (取模)%

运算法则

  • 加法: num1 + num2
  • 减法:num1 - num2
  • 乘法:num1 \ * num2
  • 整除:num1 / num2
  • 取余(求模):num1 % num2 (求 num1 除以 num2 的余数)

2.运算举例

2.1 expr

expr命令是一个手工命令行计数器,用于在UNIX/LINUX下求表达式变量的值,一般用于整数值,也可用于字符串。

  • 变量和运算符之间,要用空格隔开。
  • 用反斜杠 \ 放在 shell 特定的字符前面;
  • 对包含空格和其他特殊字符的字符串要用引号括起来

举例1:

微信截图_20230810120324.png

举例2

微信截图_20230810120823.png

2.2 let

let var=算术表达式 和  ((var=算术表达式))  效果等同。

两者都不返回结果,需要借助echo命令。

微信截图_20230810121139.png

微信截图_20230810121432.png

2.3$[ ]$(( ))

微信截图_20230810121639.png

3.小数运算

使用bc计算器

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

  • 支持交互式和非交互式两种方式。

  • 使用scale=n可以指定精度,即小数点后的位数。要写在算术表达式之前。

  • 非交互式运算,使用 echo "算术表达式" | bc。 多个算术表达式之间用分号隔开,例如:echo '1+1;2+2" | bc。

微信截图_20230810122004.png

4.生成随机数

使用 echo $[RANDOM%n] 可以生成随机数,n为正整数。

对 n 取余数的范围是 [0,n-1]。

  • echo $[RANDOM%30]生成的随机数范围为 [0,29]
  • 如果希望随机数范围都为正整数,即不包含0的话,可以echo $[RANDOM%39+1],此时随机数范围为[1,39]。

举例:

微信截图_20230810122344.png