首页 > 技术文章 > Shell编程规范与变量

Rui-Lin 2021-07-06 08:46 原文

结构

Shell脚本概述

  • Shell的作用

  • Shell编程规范

  • 重定向与管道

Shell脚本变量

  • 自定义变量

  • 特殊变量

 

Shell脚本概述

什么是Shell?就是与内核沟通的界面、应用程序等等。比如你要播放音乐,你的计算机通过你在Shell输入的打开音乐的命令, Shell在告诉操作系统的内核用户希望打开音乐,内核在通过cpu调度、内存管理、磁盘输入输出等工作,将硬件调动,这时硬件声卡才会工作,硬件才是实际的工作者

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

Linux中有哪些Shell?
检查一下/etc/shells这个文件,里面就是Linux所包含的Shell.最常用的就是bash、tcsh、csh、sh、nologin这些shell。这些shell都是依据Linux发展者的不同所创造出的不同版本。
bash:  基准于GNU的框架下发展出的Shell
csh:  语法有点类似于c语言的Shell
tcsh:  整合了csh,提供更多的功能
sh:  已经被bash所替换
nologin:  奇怪的shell,这个shell可以让用户无法登录主机。

注: bash (/bin/bash)是目前大多数Linux版本采用的默认Shell

为什么系统上合法的Shell要写入/etc/shells这个文件呢?
这是因为系统某些服务运行过程中,会去检查用户能够使用的Shell,而这些shell的查询就是借由/etc/shells这个文件
用户什么时候可以取得shell来工作?用户默认会取得哪一个shell?
当用户登录的时候,系统就会给我一个shell让我来用,而这个登录取得的Shell就记录在/etc/passwd这个文件内。

 

Shell脚本的概念

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

Shell脚本应用场景

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

 

 

 

Shell的作用

用户的登录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脚本

编写脚本代码

  • 使用vim文本编辑器
  • 每行一条Linux命令,按执行顺序依次编写
#!/bin/bash
echo "hello"

  

 

 

赋予可执行权限

  • 使脚本具有可执行属性

 

 

Shell脚本的执行

方法一:指定路径的命令,要求文件必须有x权限。

chmod +x /root/first.sh
指定绝对路径: /root/first.sh
指定相对路径: ./first.sh

方法二:指定Shell来解释脚本,不要求文件必须有x权限。

sh 脚本路径: sh first.sh
source 脚本路径: . first.sh或者source first.sh

 

####脚本文件路径(绝对路径与相对路径)
[root@localhost ~]# /opt/first_demo.sh #必须有x权限
####sh 脚本文件路径
[root@localhost ~]# sh /opt/first_demo.sh
####source 脚本文件路径
[root@localhost ~]# source /opt/first_demo.sh #也可通过"."来执行

  

 

更完善的脚本构成

  • 脚本声明

  • 注释信息

  • 可执行语句

 

重定向与管道操作

交互式硬件设备

  • 标准输入:从该设备接收用户输入的数据
  • 标准输出:通过该设备向用户输出数据
  • 标准错误:通过该设备报告执行出错信息
类型 设备文件 文件描述编号 默认设备
标准输入 /dev/stdin 0 键盘
标准输出 /dev/stdout 1 显示器
标准错误输出 /dev/stderr 2 显示器

 

重定向操作 

类型 操作符 用途
重定向输入 < 从指定的文件读取数据,而不是从键盘输入
重定向输出 > 将输出结果保存到指定的文件(覆盖原有内容)
>> 将输出结果追加到指定的文件尾部
标准错误输出 2> 将错误信息保存到指定的文件(覆盖原有内容)
2>> 将错误信息追加到指定的文件中
混合输出 &> 将标准输出、标准错误的内容保存到同一个文件中

 

管道操作符号

  • 将左侧的命令输出结果,作为右侧命令的处理对象
  • 不是所有命令都适用管道符号,有时需要xargs命令来传输

示例:

[root@localhost ~]# free -m                                  ####查看内存和交换分区的使用情况
              total        used        free      shared  buff/cache   available
Mem:           1823         753          66           9        1003         835
Swap:          4095           0        4095
[root@localhost ~]# free -m | grep "Mem"                     ####筛选"Mem"行
Mem:           1823         750          69           9        1002         839
[root@localhost ~]# free -m | grep "Mem" | awk '{print $4}'  ####查看物理内存的剩余空间
65

  

 

Shell变量的作用、类型

变量的作用

  • 用来存放系统和用户需要使用的特定参数(值)
    • 变量名:使用固定的名称,由系统预设或用户定义
    • 变量值:能够根据用户设置、系统环境的变化而变化

变量的类型

  • 自定义变量:由用户自己定义、修改和使用
  • 特殊变量:环境变量,只读变量,位置变量,预定义变量

 

自定义变量

定义一个新的变量

变量名=变量值

  

查看变量的值

echo $变量名

  

赋值时使用引号

  • 双引号:允许通过$符号引用其他变量值
  • 单引号:禁止引用其他变量值, $视为普通字符
  • 反撇号:命令替换,提取命令执行后的输出结果
[root@localhost ~]# name=zhangsan
[root@localhost ~]# echo $name
zhangsan
[root@localhost ~]# name=test1
[root@localhost ~]# echo $name
test1
[root@localhost ~]# echo "$name is authorized"  ###允许通过$符号引用其他变量值
test1 is authorized
[root@localhost ~]# echo '$name is authorized'  ###禁止引用其他变量值,$视为普通字符
$name is authorized
[root@localhost ~]# info=`ls -r`                ###命令替换,提取命令执行后的输出结果
[root@localhost ~]# echo $info
桌面 音乐 下载 文档 图片 视频 模板 公共 passwd6.txt ks.cfg initial-setup-ks.cfg anaconda-ks.cfg

  

从键盘输入内容为变量赋值

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

  

[root@localhost ~]# read -p "please input your name:" username
please input your name:xiaoming
[root@localhost ~]# echo $username
xiaoming

  

 

 

自定义变量

设置变量的作用范围

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

 

局部变量:

直接设置的变量是局部变量,只在当前shell 环境生效,如果重开终端,或者开启一个新的shell 环境,或者登陆其他用户账号,则变量失效

[root@localhost ~]# name=lisi
[root@localhost ~]# echo $name
lisi
[root@localhost ~]# bash
[root@localhost ~]# echo $name

[root@localhost ~]# exit
exit
[root@localhost ~]# echo $name
lisi

 

全局变量:

可以在全局都有效的变量,不管是新的bash环境,还是其他用户账号,都会有效

[root@localhost ~]# export myhost=jiangsu
[root@localhost ~]# echo $myhost
jiangsu
[root@localhost ~]# bash
[root@localhost ~]# echo $myhost
jiangsu
[root@localhost ~]# exit
exit

  

 

整数变量的运算

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

  

常用运算符

  • 加法运算: +
  • 减法运算: -
  • 乘法运算: \*
  • 除法运算: /
  • 求模(取余)运算: %(和乘除运算有相同优先级)

 

特殊的Shell变量

环境变量

  • 由系统提前创建,用来设置用户的工作环境
  • 配置文件: /etc/profile、-/.bash_profile

常见的环境变量

  • PWD, PATH
  • USER, SHELL, HOME

 

只读变量

  • 用于变量值不允许被修改的情况
[root@localhost ~]# name=cloud
[root@localhost ~]# readonly name //设置为只读变量
[root@localhost ~]# echo $name
cloud
[root@localhost ~]# name=yun
-bash:name:readonly variable //只读变量不可以被重新赋值
[root@localhost ~]#
[root@localhost ~]# unset name //只读变量不可以被删除
-bash:unset:name:cannot unset:readonly variable

  

 

推荐阅读