当前位置:网站首页>Shell脚本——Shell编程规范及变量

Shell脚本——Shell编程规范及变量

2022-04-23 16:53:00 Kiro君

一、Shell脚本概述

1.1.1 Shell基本概念

  • 将要执行的命令按顺序保存到一个文本文件
  • 给该文件可执行权限
  • 可结合各种Shell控制语句以完成更复杂的操作

1.1.2 Shell脚本应用场景

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

1.1.3 Shell作用——翻译官

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

二、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

在这里插入图片描述

版权声明
本文为[Kiro君]所创,转载请带上原文链接,感谢
https://blog.csdn.net/m0_61744194/article/details/124313677