Shell的编程规范与变量

208 阅读6分钟

image.png


Shell脚本概述

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

概念

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

Shell作用

Shell的作用:命令解释器,相当于翻译官

  • 介于系统内核与用户之间,负责解释命令行 image.png

用户登录的Shell

登录后默认使用的Shell程序,一般为/bin/bash
bash(/bin/bash)是目前大多数Linux版本采用的默认Shell
/etc/shells文件可查看Linux所包含的shell image.png

程序介绍
bash基准于GNU的框架下发展出的shell
csh语法有点类似于c语言的shell
tcsh整合了csh,提供更多的功能
sh己经被bash所替换
nologin奇怪的shell,这个shell可以让用户无法登录主机
Shell脚本应用场景
  • 自动化运维
  • 批量化重复操作可以编写脚本结合计划任务自动周期运行
  • 减轻管理员工作量
  • 提高处理文本文件的速度
  • 避免配置出错
补充
  • 为什么系统上合法的shell要写入/etc/shells这个文件?
    这是因为系统某些服务运行过程中,会去检查用户能够使用的Shell,而这些shell的查询就是借由/etc/ shells这个文件。
  • 用户什么时候可以取得shell来工作?用户默认会取得哪一个shell?
    当用户登录的时候,系统就会给一个shell让用户来用,而这个登录取得的shell就记录在/etc/passwd这个文件内。 image.png

Shell编程规范

shell脚本的构成

  1. 脚本申明(解释器):若第一行为"#!/bin/bash",表示此行以下的代码语句是通过/bin/bash程序来解释执行,#!/bin/bash为默认解释器。
    还有其它类型的解释器,比如#!/usr/bin/python、# !/usr/bin/expect。
  2. 注释信息:以“#”开头的语句表示为注释信息,被注释的语句在运行脚本时不会被执行。
  3. 可执行语句:比如echo命令,用于输出" "之间的字符串 image.png
执行shell脚本

执行shell脚本需要有该文件的可执行权限,否则会执行失败。 image.png image.png

赋予执行权限后,即可执行脚本中的指令。

  1. 相对路径方式执行 image.png

  2. 绝对路径方式执行 image.png

  3. bash/sh 脚本名来执行(可没有执行权限image.png

  4. source 脚本名或 . 脚本名执行(可没有执行权限image.png image.png

不同执行方式区别

image.png

  • 在脚本的子shell环境中执行脚本中的代码

    • 使用绝对路径或者相对路径指定脚本的路径运行,要求脚本文件必须要有执行权限x
    • 指定shell程序来直接解释运行脚本(bash/sh) image.png
  • 在当前的shell环境中执行脚本里的代码操作,也就是脚本文件中的代码或者命令会影响当前shell环境

    • source 脚本名
    • . 脚本名 image.png image.png

重定向与管道操作

交互式硬件设备

类型介绍设备文件文件描述编号默认设备
标准输入从该设备接收用户输入的数据/dev/stdin0键盘
标准输出通过该设备向用户输出数据/dev/stdout1显示器
标准错误输出通过该设备报告执行出错信息/dev/stderr2显示器

重定向操作

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

  • 重定向输出 image.png

  • 重定向错误输出 image.png

  • 混合输出 image.png image.png

管道操作

将管道符号“|”左侧的命令输出的结果,作为右侧命令的输入(处理对象),同一行命令中可以使用多个管道。

如果管道符合右边是一定需要执行对象的命令,则管道符号后面要有 xargs 命令来传递执行参数。

实例 image.png image.png

Shell脚本变量

变量的作用

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

变量的类型

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

自定义变量

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

#定义一个新的变量
变量名=变量值
#查看变量值
echo $变量名

image.png

补充

  • 为防止出现歧义,建议变量名外加{} image.png

  • 如果想赋予的值中间有空格隔开,则需要加引号''或"" image.png image.png

  • ' ' 和 " " 的区别 image.png image.png image.png

read

作用:获取标准输入的内容给变量,只能赋予一行内容 image.png image.png

运用在脚本中

image.png image.png

echo -n:不换行输出 image.png image.png

局部变量与全局变量

局部变量

局部变量只会在当前shell环境中有效。

  • bash/sh运行脚本后,赋予给abc变量的值,在当前shell环境并不有效。 image.png
  • 当前环境中的变量,切换shell环境后,输出为空。 image.png
全局变量
#临时设置全局变量,重启后消失
export 变量名=变量值
#局部变量改变成全局变量
export 变量名

全局变量对所有shell环境都有效。 1.png

局部变量改变成全局变量

3.png

系统中的全局变量

2.png

shell中整数变量运算

#变量运算方式
expr 数值或变量  运算符  数值或变量
$((数值 运算符 数值))
$[数值 运算符 数值]
let 变量=<数值>运算符<数值>
运算符号
加法+
减法-
乘法\ *
除法/
取余%
  • expr 4.png

  • $ (())和$ [ ] 5.png

  • let 6.png

小数的运算
bc
echo "浮点运算表达式" | bc

7.png

  • 结果小数的位数由运算式中小数位最多的数确定。 8.png

  • scale可指定小数位数。 9.png

awk
awk 'BEGIN {print 浮点运算表达式}'
  • awk计算小数,结果位数为六位有效数字。 image.png 11.png

特殊变量

环境变量

环境变量由系统提前创建,用来设置用户的工作环境。
使用env命令可以查看到当前工作环境下的环境变量 12.png

  • USER表示用户名称
  • HOME表示用户的宿主目录
  • LANG表示语言和字符集
  • PWD表示当前所在的工作目录
  • PATH表示可执行程序的默认搜索路径
让自己创建的脚本文件全局可用
  1. 把脚本文件复制到PATH中的一个目录中,或者创建软链接到其中一个目录中 13.png 14.png

  2. 将脚本文件所在目录的绝对路径添加到PATH后,重启后失效 15.png

    永久配置:

    1. /etc/profile中,最后添加PATH=$PATH:/data 16.png

    2. source /etc/profile执行 17.png

    3. 重启 18.png

只读变量

赋予变量值后,只读变量不能删除修改。
临时配置的重启后失效。 19.png

永久配置:
在/etc/profile配置,删除配置后失效 image.png

位置变量

当执行命令行操作时,第一个字段表示命令名或脚本程序名,其余的字符串参数按照从左到右的顺序依次赋值给位置变量。

运用:计算两数之和

image.png

其中$1为脚本后跟的第一个参数,$2为脚本后跟的第二个参数,计算两数和。 image.png

补充

$0为脚本本身,$1~9为脚本后跟的1~9个参数,从第十个参数开始需要加{}(例:${10}) image.png image.png

预定义变量

  • $0:脚本本身
  • $#:脚本后面跟的参数个数

image.png image.png

$*和$@不带引号

$*、$@:脚本后面跟的所有参数 image.png image.png

$*和$@带引号
  • "$*":会把脚本后面跟的所有参数当作一个整体看待
  • "$@":会把脚本后面跟的所有参数看作多个以空格分隔的个体 image.png image.png
$? 的作用

$?:表示前一条命令或脚本执行后的返回状态码,返回值为0表示执行正确,返回任何非0值均表示执行出现异常。也常被用于shell脚本中return退出函数并返回的退出值。 image.png

补充:date的使用
常用格式作用
%Y年份
%m月份 1~12
%d按月计的日期
%F完整日期格式,等价于 %Y-%m-%d

image.png image.png

选项-d

显示时间由STRING描述

  • 显示前一天
  • 显示后一天 image.png
时间表示
前一天-1 day
后一天+1 day
前一周-1 week
后一周+1 week
前一个月-1 month
后一个月+1 month
前一年-1 year
后一年+1 yesr
  • 显示上个月最后一天 image.png

  • 显示这个月最后一天 image.png

实操:打包多个文件

打包多个文件 image.png 运行结果 image.png image.png