Shell脚本编程规范与变量介绍(完整详细,建议收藏)

前言:

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

一、Shell脚本概述

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

二、Shell脚本应用场景

重复性操作
批量事物处理
自动化运维
服务运行状态监控(zabbix)
定时任务执行

三、Shell脚本的作用

3.1 Shell脚本的作用:命令解释器,翻译官

介于系统内核与用户之间,负责解释命令行
在这里插入图片描述
shell 控制Linux内核,内核态会加载系统硬件提供支持,然后输出信息 (结果、bug、err)

shell 也可以通过控制应用程序,再进行控制Linux内核

应用程序(例如kickstart 无人值守)

内核放在boot中,boot还存放的GRUB菜单

3.2 用户的登录Shell

登录后默认使用的Shell程序,一般为/bin/bash

不同的Shell的内部指令,运行环境等会有所区别
示例

[root@localhost ~]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh

四、编写Shell脚本

4.1 编写脚本代码

使用vi文本编辑器
每行一条Linux命令,按执行顺序依次编写
示例

[root@localhost ~]# vi first.sh
#!/bin/bash
cd /boot/
pwd
ls -lh vm*

#!/bin/bash :代表固定格式,相当于声明

cd /boot :跳转到boot目录

pwd :显示目前所在工作环境的目录

ls -lh vm* :长格式友好显示(带有单位)以vm开头的所有文件。

4.2 执行脚本

注意!在执行脚本前我们要养成赋予脚本可执行权限的习惯
示例

[root@localhost ~]# chmod +x first.sh 
[root@localhost ~]# ls -l 
-rwxr-xr-x. 1 root root   37 Nov 25 22:22 first.sh
.....省略部分内容

执行脚本的四种方式:
方法一
:脚本文件路径(绝对路径与相对路径)

[root@localhost ~]# ./first.sh 

方法二:sh 脚本文件路径

[root@localhost ~]# sh first.sh

方法三:source 脚本文件路径

[root@localhost ~]# source first.sh 

此方法也不要求脚本拥有执行权限,但若脚本中执行了切换位置的命令,此方式同样会进行切换。

方法四:"." 的使用

[root@localhost ~]# . first.sh 

此方式与方法三类似,但就生产环境而言,我们一般不会使用此方式。

4.3 更完善的脚本构成

脚本声明
注释信息
可执行语句
示例

#!/bin/bash
#这是我的第一个脚本.
cd /boot/
echo "当前的目录位于:"
pwd
echo "其中以vm开头的文件包括:"
ls -lh vm*
~                  

执行脚本

[root@localhost ~]# sh first.sh
当前的目录位于:
/boot
其中以vm开头的文件包括:
-rwxr-xr-x. 1 root root 5.7M Nov 25 19:07 vmlinuz-0-rescue-0c76c4a5ba044cb8a81c079681ade901
-rwxr-xr-x. 1 root root 5.7M Aug 23  2017 vmlinuz-3.10.0-693.el7.x86_64

五、重定向与管道操作

5.1 交互式硬件设备

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

标准输入:从该设备接收用户输入的数据
标准输出:通过该设备向用户输出数据
标准错误:通过该设备报告执行出错误信息

5.2 重定向操作与管道操作

5.2.1 重定向操作

名称 符号 文件描述简介
标准输入重定向 0<或< 清空已有内容,数据一般从文件流向处理命令
追加输入重定向 0<<或<< 追加内容到底部,数据一般从文件流向处理命令
标准输出重定向 1>或> 正常输出重定向到文件,会清空已有内容
标准输出追加重定向 1>>或>> 将内容追加重定向到文件,不会清空已有内容
标准错误输出重定向 2> 将标准错误内容重定向到文件如果文件存在内容则清空
标准错误追加输出重定向 2>> 将标准错误内容追加到文件底部,不会清空已有内容
混合输出 &> 将标准输出、标准错误的内容保存到同一个文件中

5.2.2 管道操作符号”|“

将左侧的命令输出结果,作为右侧命令的处理对象
格式:cmd1 | cmd2 [… | cmdn]

示例

[root@localhost ~]# grep "login$" /etc/passwd | awk -F: '{print $1,$7}'
bin /sbin/nologin
daemon /sbin/nologin
adm /sbin/nologin
lp /sbin/nologin
.......省略部分内容

awk -F: ‘{print $1,$7}’ 输出第一列与第七列

awk -F : 以":"分割

**{print $1,$7}:**位置变量统计

如果awk不加参数,只加段落内容,系统将默认按空格和tab(制表符)进行分割

六、Shell变量的作用、类型

6.1 变量的作用

为灵活管理Linux系统提供特定的参数,包含两层意思:
变量名:使用固定的名称,由系统预设或用户定义
变量值:能够根据用户设置、系统环境的变化而变化

6.2 变量的类型

自定义变量:由用户自己定义、修改和使用
环境变量:由系统维护,用于设置工作环境(例如PATH)
位置变量:通过命令行给脚本程序传递参数
预定义变量:Bash中内置的一类变量,不能直接修改 (例如0、0、0、*、$#)

6.2.1 自定义变量1

定义一个新的变量
变量名以字母或下划线开头,区分大小写,建议全部大写

变量名=变量值

“=” 为赋值符号,代表把赋值符号右边的内容赋予给左边的变量名

变量名的命名,以字母或者下划线开头,例如:

addr="192.168.100.100";

命名时,要么以字母开头,要么以”_“开头,例如:

_abc="hello"

不能以123abc=”world“;此格式进行命名

查看变量的值
在输出时,需要在变量名前加上$符号

示例

[root@localhost ~]# addr=192.168.100.100
[root@localhost ~]# echo $addr
192.168.100.100

PS:所有变量会存储在内存中,内存中的数据并不稳定(例如关机后会丢失)

此处需要注意:
如果重新赋予新的值,那么命名的值会更新(覆盖)
示例:

[root@localhost ~]# addr=192.168.100.100
[root@localhost ~]# echo $addr
192.168.100.100
[root@localhost ~]# addr=10
[root@localhost ~]# echo $addr
10

变量名对应的赋予值会独立存储
示例:

[root@localhost ~]# addr=192.168.100.100
[root@localhost ~]# echo $addr
192.168.100.100
[root@localhost ~]# addr=10
[root@localhost ~]# echo $addr
10
[root@localhost ~]# num=$addr
[root@localhost ~]# addr=20
[root@localhost ~]# echo $num
10
[root@localhost ~]# echo $addr
20

从以上信息我们可以得知,变量名在被赋予变量值后,会单独存储在一份空间,并不会随着之后的变量值更改而更改。

允许同时输出两个变量
示例:

[root@localhost ~]# echo $addr $num
20 10
[root@localhost ~]#

双引号输出的是变量
在这里插入图片描述
单引号控制输出的是普通符号与单词
在这里插入图片描述

6.2.2 自定义变量2

赋值时使用引导

双引号:允许通过 符号引用其他变量值 单引号:禁止引用其他变量值, 视为普通字符
反撇号:命令替换,提取命令执行后的输出结果
从键盘输入内容为变量赋值

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

反撇号”`“ 命令替换,提取命令执行后的输出结果

示例

[root@localhost opt]# ps aux | wc -l
188
[root@localhost opt]# num=`ps aux | wc -l`
[root@localhost opt]# echo $num
189
[root@localhost opt]# abc=$(ps aux | wc -l)
[root@localhost opt]# echo $abc
189

read [-p “提示信息”] 变量名

示例一:

#!/bin/bash
echo "请输入你的成绩"
read score
echo "你的成绩为$score"

示例二:

你的成绩为12
#!/bin/bash
read -p "请输入你的成绩" score
echo "你的成绩为$score"
---->wq
[root@localhost opt]# ./demo.sh
请输入你的成绩12
你的成绩为12

6.2.3 自定义变量3

设置变量的作用范围
命令格式1:export 变量名

格式2:export 变量名=变量值

两种格式可以混用

6.2.4 自定义变量 4

计算整数表达式的运算结果

格式:expr 变量1 运算符 变量2

expr的常用运算符

加法运算:+

减法运算:-

乘法运算:*

除法运算:/

取余运算:%

例如:

[root@localhost opt]# expr 3 + 2
5
[root@localhost opt]# expr 3 - 2
1
[root@localhost opt]# expr 3 \* 2
6
[root@localhost opt]# expr 3 % 2
1
[root@localhost opt]# sum=`expr 3 + 3`
[root@localhost opt]# echo $sum
6

6.3 特殊Shell变量

环境变量

由系统提前创建,用来设置用户的工作环境

配置文件: /etc/profile、~/.bash_profile

常见的环境变量

PWD、PATH

USER、SHELL、HOME

示例:

[root@localhost opt]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

6.3.1 特殊的Shell变量 1

位置变量

位置表示为$n,n为1~9之间的数字

例如:

[root@localhost opt]# ./demo.sh one two three four five six

以上示例中 ./demo.sh 为$0 one为$1 一次类推

示例:

[root@localhost opt]# vi demo01.sh
#!/bin/bash
sum=0
sum=`expr $1 + $2`
echo "总和为$sum"
echo "执行的脚本数为$0"
echo "参数格式为$#"
------->wq
[root@localhost opt]# ./demo01.sh 10 20
总和为30
执行的脚本数为./demo01.sh
参数格式为2

6.3.2 特殊的Shell变量 2

预定义变量

$#:命令行中位置变量的个数

$*:所有位置变量的内容

$?:上一条命令执行后返回的状态,当返回状态值为0时表示执行正常,非0值表示执行异常或出错

$0:当前执行的进程/程序名

示例:

[root@localhost opt]# vi demo02.sh
#!/bin/bash
TARFILE=beifen-`date +%s`.tgz
tar zcf $TARFILE $* &> /dev/null
echo "已执行$0脚本"
echo "共完成$#个对象的备份"
echo "具体内容包括:$*"
--------》wq
[root@localhost opt]# chmod +x demo02.sh 
[root@localhost opt]# ./demo02.sh  /etc/passwd /etc/shadow
已执行./demo02.sh脚本
共完成2个对象的备份
具体内容包括:/etc/passwd /etc/shadow

预定义变量

$#:命令行中位置变量的个数

$*:所有位置变量的内容

$?:上一条命令执行后返回的状态,当返回状态值为0时表示执行正常,非0值表示执行异常或出错

$0:当前执行的进程/程序名
示例:

[root@localhost opt]# vi demo02.sh
#!/bin/bash
TARFILE=beifen-`date +%s`.tgz
tar zcf $TARFILE $* &> /dev/null
echo "已执行$0脚本"
echo "共完成$#个对象的备份"
echo "具体内容包括:$*"
--------》wq
[root@localhost opt]# chmod +x demo02.sh 
[root@localhost opt]# ./demo02.sh  /etc/passwd /etc/shadow
已执行./demo02.sh脚本
共完成2个对象的备份
具体内容包括:/etc/passwd /etc/shadow

总结

Shell脚本变成规范与变量是我们学习的基础,我认为在写Shell脚本的过程中,我们尤为需要注重:
1、Shell脚本中需空格的部分
2、撇、双引号、单引号、小括号、中括号和大括号的用法

对于三种括号的用法,小结以下技巧:
字符串比较用双中括号 [[ ]] ;算数比较用单中括号 [ ] ----左右需留空格
算数运算用双小括号(( ));Shell命令及输出用小括号( )-------左右不需要留空格
快速替换用大括号 { }------左右需留空格
反单引号起着命令替换的作用(ESC下方的键)
3、打“引号”的时候,输入法最好统一(中、英文输入法)

猜你喜欢

转载自blog.csdn.net/weixin_47219818/article/details/107433845