Shell脚本编程规范与变量(基础)

文章目录

        • 前言:
        • 一、Shell脚本概述
        • 二、Shell脚本应用场景
        • 三、Shell脚本的作用
          • 3.1 Shell脚本的作用:命令解释器,翻译官
          • 3.2 用户的登录Shell
        • 四、编写Shell脚本
          • 4.1 编写脚本代码
          • 4.2 执行脚本
          • 4.3 更完善的脚本构成
        • 五、重定向与管道操作
          • 5.1 交互式硬件设备![在这里插入图片描述](https://img-blog.csdnimg.cn/20191126162959646.png)
          • 5.2 重定向操作与管道操作
            • 5.2.1 重定向操作
            • 5.2.2 管道操作符号”|“
          • 六、Shell变量的作用、类型
          • 6.1 变量的作用
          • 6.2 变量的类型
            • 6.2.1 自定义变量1
            • 6.2.2 自定义变量2
            • 6.2.3 自定义变量3
            • 6.2.4 自定义变量 4
          • 6.3 特殊Shell变量
            • 6.3.1 特殊的Shell变量 1
            • 6.3.2 特殊的Shell变量 2
        • 总结:

前言:

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

一、Shell脚本概述

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

二、Shell脚本应用场景

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

三、Shell脚本的作用

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

介于系统内核与用户之间,负责解释命令行
Shell脚本编程规范与变量(基础)_第1张图片

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 交互式硬件设备Shell脚本编程规范与变量(基础)_第2张图片
  • 标准输入:从该设备接收用户输入的数据
  • 标准输出:通过该设备向用户输出数据
  • 标准错误:通过该设备报告执行出错误信息
5.2 重定向操作与管道操作
5.2.1 重定向操作

Shell脚本编程规范与变量(基础)_第3张图片

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 ~]#

双引号输出的是变量
Shell脚本编程规范与变量(基础)_第4张图片

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

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 变量名=变量值

两种格式可以混用

示例:
Shell脚本编程规范与变量(基础)_第5张图片

6.2.4 自定义变量 4
  • 整数变量的运算

expr 变量1 运算符 变量2 [运算符 变量3]…

  • 常用运算符
    Shell脚本编程规范与变量(基础)_第6张图片

例如:

[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、打“引号”的时候,输入法最好统一(中、英文输入法)

你可能感兴趣的:(Shell脚本攻略)