Shell编程规范与变量
一、shell脚本概述
1.1 shell的作用
Shell(壳程序)是一个特殊的应用程序,它介于操作系统内核与用户之间,充当了一个“命令解释器”的角色,负责接收用户输入的操作
指令(命令)并进行解释,将需要执行的操作传递给内核执行,并输出执行结果。
1.2 Linux中shell的种类
Linux所包含的Shell在/etc/shells这个文件内
- sh:UNIX最初使用的 shell,已经被bash所替换
- bash:基准于GNU的框架下发展出的Shell,是 sh 的扩展。
- csh:语法有点类似于c语言的Shell。
- tcsh:整合了csh,提供更多的功能。
- nologin:这个shell可以让用户无法登录主机。
注:bash(/bin/bash)是目前大多数 Linux 版本采用的默认 Shell。
1.3 shell脚本的作用
- 自动化运维
- 批量化重复操作可以编写脚本结合计划任务自动周期运行
- 减轻管理员工作量
- 提高处理文本文件的速度
- 避免配置出错
1.4 shell脚本的构成
#!/bin/bash //脚本声明(解释器),表示此行以下的代码通过/bin/bash程序翻译执行 # This is my first Shell-Script. //以“#”开头的语句表示为注释信息,被注释的语句在运行脚本时不会被执行 cd /boot echo "当前的目录位于:" //可执行语句:比如echo命令,用于输出" "之间的字符串 pwd echo "其中以 vml 开头的文件包括:" ls -lh vml*
1.5 脚本执行逻辑
- 顺序执行:程序按从上到下顺序执行
- 选择执行:程序执行过程中,根据条件的不同,进行选择不同分支继续执行
- 循环执行:程序执行过程中需要重复执行多次某段语句
1.6 shell脚本的执行方式
方法一:指定路径的命令,要求文件必须有 x 权限。 chmod +x /root/first.sh 指定绝对路径:/root/first.sh 指定相对路径:./first.sh
方法二:指定Shell来解释脚本,不要求文件必须有 x 权限。(适用于脚本调试) sh+脚本名:sh first.sh bash+脚本名:bash first.sh source+脚本名:. first.sh 或者 source first.sh
二、重定向与管道符
2.1 重定向
- 交互式硬件设备
类型 | 设备文件 | 文件描述编号 | 默认设备 |
标准输入 | /dev/stdin | 0 | 键盘 |
标准输出 | /dev/stdout | 1 | 显示器 |
标准错误输出 | /dev/stderr | 2 | 显示器 |
- 标准输入(STDIN):默认的设备是键盘,文件编号为 0,命令将从标准输入文件中读取在执行过程中需要的输入数据。
- 标准输出(STDOUT):默认的设备是显示器,文件编号为 1,命令将执行后的输出结果发送到标准输出文件。
- 标准错误(STDERR):默认的设备是显示器,文件编号为 2,命令将执行期间的各种错误信息发送到标准错误文件。
2.2 重定向操作
面试题:如何不删除文件,清空文件内容
cat /dev/null > 文件名
cat /dev/null > 文件名
2.3 管道符
|
|
将左侧的命令输出结果,作为右侧命令的处理对象,一般针对文本内容
三、shell脚本中的变量
3.1 变量的作用
用来存放系统和用户需要使用的特定参数(值)
3.2 变量的构成
变量由变量名和变量值组成
变量名的规范:
要有注释,还要注意前后一致
变量值:能够根据用户设置、系统环境的变化而变化
变量值的范围:
种类 | 含义 |
int | 整数 |
string | 字符串 |
0,1 | 真,假(布尔) |
1.1 2.2 … | 浮点型 |
3.3 变量的类型
3.3.1 自定义变量
自定义变量:由用户自己定义、修改和使用,只能在当前shell中使用
- 定义新的变量
变量名=变量值
- 查看变量的值
echo $变量名
${}是一种特殊的语法形式,用于获取变量的值或者对变量进行操作。
${}语法可以应用于任何变量名称,其中变量名称放在花括号中
3.3.2 只读变量
readonly 变量名
只读变量设置完成后不可更改,重启使之失效
3.3.3 赋值时使用引号
- 双引号:允许通过$符号引用其他变量值
- 单引号:禁止引用其他变量值,$视为普通字符
- 反撇号:命令替换,提取命令执行后的输出结果,
…
和$(…)作用相同
3.3.4 read命令获取输入内容
3.4 变量的作用范围
默认情况下,新定义的变量只在当前的Shell环境中有效,因此称为局部变量。当进入子程序或新的子Shell环境时,局部变量将无法再使用。
3.4.1 全局变量
格式1:export 变量名 格式2:export 变量名=变量值
全局变量:在程序或脚本中定义的具有全局范围的变量。这意味着全局变量在整个程序或脚本的不同部分都是可见和可访问的,而不仅限制于特定的函数、方法或代码块。
全局变量的主要特点:
- 全局范围: 全局变量在整个程序或脚本的各个部分都是可见和可访问的。
- 持久性: 全局变量的生命周期与程序的执行时间相同。它们在程序启动时创建,在程序结束时销毁。
- 共享性: 全局变量可以在程序的不同函数或方法之间共享数据。这样,多个函数可以使用和修改相同的全局变量。
全局变量的缺点:
- 因为全局变量是可访问的,所以它们可以被任何函数修改,这可能导致程序状态的不确定性和难以调试的问题。
环境变量的全局配置文件为/etc/profile,在此文件中定义的变量作用于所有用户。
每个用户还有自己的独立配置文件(~/.bash_profile)。可以用来长期变更或设置某个环境变量。
3.4.2 整数变量的运算
格式:
expr 变量1 + 变量2 expr 变量1 - 变量2 expr 变量1 \* 变量2 expr 变量1 / 变量2 expr 变量1 % 变量2 (取余)
常用的运算表达式:
i=$(expr 12 \* 5) i=$((12*5)) i=$[12*5] #这种用法已弃用 let i=12*5
补充
i++ 相当于 i=$(($i+1)) i-- 相当于 i=$(($i-1)) i+=2 相当于 i=$(($i+2)) i++ 是先赋值再加1 i=1+1 ++i 是加后再赋值1 1+1=2 2+1=3
3.4.3 bc计算器
bc是一个简单易用的计算器程序,可以用于执行基本的数学运算,包括加、减、乘、除和取余等操作
[root@localhost opt]# echo 2*2 | bc 4 [root@localhost opt]# echo 4^2 | bc 16
3.4.4 非整数运算
bash 不支持浮点运算,如果需要进行浮点运算,需要借助bc,awk 处理
#加 f=$(echo "4.3+2.5"|bc) echo "4.3+2.5=$f" #减 f=$(echo "4.3-2.5"|bc) echo "4.3-2.5=$f" #乘 f=$(echo "4.30*2.50"|bc) echo "4.3*2.5=$f" #除 f=$(echo "scale=2;4.3/2.5"|bc) echo "4.3/2.5=$f" #混合运算 f=$(echo "2.2/(2.2-1.1)*2+1.1"|bc) echo "2.2/(2.2-1.1)*2+1.1=$f" #加 f=$(awk 'BEGIN{print 4.5+3.4 }') echo "4.5+3.4=$f" #减 f=$(awk 'BEGIN{print 4.5-3.4 }') echo "4.5-3.4=$f" #乘 f=$(awk 'BEGIN{print 4.5*3.4 }') echo "4.5*3.4=$f" #除 f=$(awk 'BEGIN{print 4.5/3.4 }') echo "4.5/3.4=$f" #混合 f=$(awk 'BEGIN{print (4.5-3.4)*2+3 }') echo "(4.5-3.4)*2+3=$f"
3.4.5 环境变量
环境变量由系统提前创建,用来设置用户的工作环境,配置系统行为、传递信息和控制程序的执行
使用 env 命令可以查看到当前工作环境下的环境变量
环境变量由系统提前创建,用来设置用户的工作环境,配置系统行为、传递信息和控制程序的执行
使用 env 命令可以查看到当前工作环境下的环境变量
- 例如,HOME变量指定了当前用户的主目录路径。
- 预定义环境变量: 操作系统或应用程序预先定义了一些常用的环境变量,用于提供特定的信息和功能。
- 例如,USER变量保存当前用户名,LANG变量指定了当前系统的默认语言。
- 自定义环境变量: 用户和应用程序可以定义自己的环境变量,用于存储特定的信息或配置。这些变量可以根据需要随时创建、修改和删除。
环境变量名 | 含义 |
$USER | 表示用户名称 |
$HOME | 表示用户的宿主目录 |
$LANG | 表示语言和字符集 |
$PWD | 表示当前所在工作目录 |
$PATH | 表示可执行用户程序的默认路径 |
3.4.6 位置变量(命令行参数)
位置变量是在运行脚本或程序时传递给它们的值。位置变量用于将外部数据传递给脚本或程序,以便根据需要进行处理
传参顺序:从左到右
$n:n为数字,$0代表命令本身
$1-9代表从第一个到第九个参数,十以上的参数需要{}表示
如: ${10}
3.4.7 预定义变量
预定义变量:通常由编程语言或脚本解释器提供,并根据需要自动设置和更新,不能修改