Shell编程规范及变量
一、Shell脚本概述
1.1.1 Shell基本概念
- 将要执行的命令按顺序保存到一个文本文件
- 给该文件可执行权限
- 可结合各种Shell控制语句以完成更复杂的操作
1.1.2 Shell脚本应用场景
- 重复性操作
- 交互性任务
- 批量事务处理
- 服务运行状态监控
- 定时任务执行
1.1.3 Shell作用——翻译官
shell是一个特殊的应用程序,它介于操作系统内核和用户之间,充当了一个“命令解释器”的角色,负责接收用户输入的操作指令并进行解释,将需要执行的操作传递给内核执行,并输出执行结果。
二、shell编程规范
2.1 用户登录shell
- 登录后默认使用的shell程序,一般为/bin/bash
- 不同shell的内部指令、运行环境等会有所不同
shell | 说明 |
---|---|
bash | $基准于GNU的框架下发展出的shell |
csh | 语法有点类似于C语言的shell |
tcsh | 整合了csh,提供更多的功能(增强版) |
sh | 已经被bash所替换(软链接) |
nologin | 奇怪的shell,这个shell可以让用户无法登录主机 |
2.2 shell脚本的组成
- 脚本申明(解释器): 若第一行为“#!/bin/bash”,表示此行一下的代码语句是通过/bin/bash程序来结实执行,#!/bin/bash为默认解释器,还有其他类型的解释器,比如#!/usr/bin/python、#!/usr/bin/expect。
- 注释信息:以“#”开头的语句表示为注释信息,被注释的语句在运行脚本时将不被执行。
- 可执行语句: 比如 echo命令,用于输出“ ”之间的字符串。
2.3 shell脚本的执行方法
方法一:指定路径的命令,要求文件必须有x权限
- 指定绝对路径:/root/first.sh
- 指定相对路径:./first.sh
方法二:指定shell来解释脚本,不要求文件必须有x权限
- sh 脚本路径:sh first.sh
- source 脚本路径:.first.sh 或者source first.sh
方法三:source 脚本路径执行shell脚本
2.4 脚本错误
命令错误:命令出错不会影响接下来的命令继续
语法错误:会影响接下来的命令继续
逻辑错误:只能自己去筛查
查找代码的正确:
bash -n 脚本名称 (不在当前目录下加绝对路径) 检查语法错误
bash -x 脚本名称 (不在当前目录下加绝对路径) 检查逻辑错误
2.5 重定向
交互式硬件设备
标准输入:从该设备接收用户输入的数据
标准输出:通过该设备向用户输出数据
标准错误:通过该设备报告执行出错信息
类型 | 设备文件 | 文件描述编号 | 默认设备 |
---|---|---|---|
标准输入 | /dev/stdin | 0 | 键盘 |
标准输出 | /dev/stdout | 1 | 显示器 |
标准错误输出 | /dev/stderr | 2 | 显示器 |
重定向操作
类型 | 操作 | 用途 |
---|---|---|
重定向输入 | < | 从指定文件读取数据 |
重定向输出 | > | 将标准输出结果保存到指定的文件,并且覆盖原有文件 |
>> | 将标准输出追加到指定的文件的尾部,不覆盖原有内容 | |
标准错误输出 | 2> | 将错误信息保存到指定文件,并且覆盖原有文件 |
2>> | 将错误信息追加到指定文件的尾部,不覆盖原有内容 | |
混合输出 | &>和2>&1 | 将标准输出,标准错误保存到同—文件中 |
案例一
将标准输出结果“132456” 保存到文件 passwd.txt; 然后标准输入密码给niangao的时候,从指定文件 passwd.txt中读取数据:
案例二
“>” 会覆盖原有文件
“>>” 不会覆盖原有文件
案例三:&用法
2>/dev/null ##把错误输出到黑洞
>/dev/null 2>&1 ##标准输出重定向到黑洞,错误输出2重定向到标准输出(标准输出和错误输出都到黑洞)
2>&1>/dev/null ##错误输出重定向到标准输出,标准输出进黑洞
补充
2.6 管道操作
将管道符号 “|” 左侧的命令输出的结果,作为右侧命令的输入(处理对象),同一行命令中可以使用多个管道
使用格式:
cmd1 命令1 | cmd2 命令2[… | cmdn 命令n]
管道操作
awk -F: '{print $1,$3}' ##意为强制输出信息并且打印第一列和第三列
三、Shell 脚本变量
各种Shell环境中都是用到了“变量”的概念。Shell变量用来存放系统和用户需要使用的特定参数值。
变量的作用
用来存放系统和用户需要使用的特定参数(值)
变量名: 使用固定的名称,由系统预设或用户定义
变量值: 能够根据用户设置、系统环境的变化而变化
变量的类型
自定义变量: 由用户自定义、修改和使用
特殊变量: 环境变量,只读变量,位置变量,预定义变量
环境变量:由系统维护,用于设置工作环境
只读变量: 用于变量值不允许被修改的情况
位置变量:通过命令行给脚本程序传递参数
预定义变量:bash中内置的一类变量,不能直接修改
3.1 自定义变量
1.定义新的变量:
格式: 变量名=变量值
[root@pxw ~]# product=c++
2.查看定义的变量的值:
格式:echo $变量名
[root@pxw ~]# version=3.5.1
3.变量赋值的特殊操作
引号 | 说明 |
---|---|
双引号 | 允许通过$符号引用其他变量 |
单引号 | 禁止引用其他变量值,$视为普通字符 |
反撇号 | 命令替换,提取命令执行后的输出结果 |
4.read命令
--------方法一:read命令获取输入内容---------
read [-p "提示信息"] 变量名
echo $变量名
[root@pxw ~]# echo 192.168.61.128 > ip.txt
[root@pxw ~]# read -p "input your IP" < ip.txt
[root@pxw ~]# echo $IP
192.168.100.10
--------方法二:在脚本中编写,在命令行实现read获取---------
read 变量名
echo $变量名
方法一:
方法二:
5.设置变量的作用范围
export 变量名=变量
3.1.1 数值变量的运算
运算符:+ 加法、- 减法、* 乘法、/除法、% 取余
expr 变量1 运算符 变量2
var=$(expr 变量1 运算符 变量2)
var=$((变量1 运算符 变量2))
var=$[变量1 运算符 变量2]
let var=变量1 运算符 变量2
i++相当于i=$[$i + 1],i++是先赋值,再运算
i--相当于i=$[$i - 1],++i是先运算再赋值
i+=1相当于i=$[$i + 1]
----扩充-----
[root@Kiro shell]# expr $[2 * 2] ##在中括号中可以直接用正常运算符
案例一:取余只需要除后的余数
#法一
[root@localhost data]#expr 3 % 2
1
#法二:定义变量,使用反撇号
[root@Kiro shell]# sum=`expr $X + $X + $Y`
[root@Kiro shell]# echo $sum
301
案例二:乘号的扩展
案例三:脚本
3.2 环境变量
环境变量指的是出于运行需要而由Linux系统提前创建的一类变量,主要用于设置用户的工作环境,包括用户宿主目录、命令查找路径、用户当前目录、登录终端等。环境变量由Linux系统自动维护,会随着用户状态的改变而改变:
- 如果修改之后,(uname) ,重启就可以恢复原样;
- 或者把之前的复制过来直接赋值变量
通过env命令进行查看,都是设定好的:
HOSTNAME=Kiro
SHELL=/bin/bash
HISTSIZE=1000
USER=root
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
PWD=/root/shell
案例:
3.3 位置变量
为了使用Shell脚本程序时,方便通过命令行为程序提供参数,bash引入了位置变量的概念。
[root@Kiro shell]# cat vars.sh
#!/bin/bash
echo $1
echo $2
echo $3
[root@Kiro shell]# ./vars.sh 11 22 cc
11
22
cc
案例:
3.4 预定义变量
与定义变量是bash预先定义好的一类特殊变量,只能使用不能创建新的:
$# :表示命令行中位置参数的个数
$*: 表示所有未知参数的内容
$?: 表示前一条命令执行后的返回状态,为0表示执行正确,非0表示执行出现异常;
$0: 表示当前执行的脚本或程序的名字
$$: 表示当前脚本的进程号
案例:
3.5 使用awk值提取IP值
[root@Kiro shell]# ip=`ifconfig ens33|awk /netmask/'{print $2}'`
[root@Kiro shell]# echo $ip
192.168.61.100
3.6 全局变量与局域变量
- 全局变量
全局变量用 export
[root@Kiro ~]# export Y=22
[root@Kiro ~]# echo $Y
22
- 局域变量
局域变量只在当前有效
[root@Kiro ~]# a=100
[root@Kiro ~]# echo $a
100
[root@Kiro ~]# exit
exit
[root@Kiro ~]# echo $a
可在pstree里查看子变量
【扩充】
- uname -p ##查询处理器型号
- /dev/null ##空洞,错误输出可以放进去
- 命令行输入“bc”==Linux的计算机
- 永久 /etc/profile