Shell脚本 shell编程规范与变量

1,377 阅读6分钟

Shell的作用

Shell(壳程序)是一种特殊的应用程序,介于系统内核与用户之间,负责解释命令行给内核,并把执行结果输出
shell在linux里相当于命令的解释器,是shell的“翻译官” image.png

Shell脚本概述

  1. 将要执行的命令按顺序保存到文本文件里,这可以执行这个文本文件代替手打
  2. 但必须要给该文件可执行权限
  3. 还可以结合其他的语言配合shell控制语句完成更复杂的操作
编程语言分为强类型和弱类型

强类型
典型代表
C、c++、JAVA、GO

弱类型
典型代表:
Shell python
也是解释性语言

程序组成

程序:算法+数据结构

  • 数据:是程序的核心
  • 算法:处理数据的方式
  • 数据结构:数据在计算机中的类型和组织方式

常用Shell脚本应用的场景

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

Shell脚本的作用

  • 自动化运维
  • 批量化重复操作可以编写脚本结合计划任务自动周期运行
  • 减轻管理员工作量
  • 提高处理文本文件的速度
  • 避免配置出错

Linux中有哪些shell脚本

Vim /etc/shell #查看有哪些shell image.png 最常用的就是bash、tcsh、sh、nologin这些shell

常用的shell作用
bash基准于GNU的框架下发展出的shell
csh语法类似于c语言的shell
tcsh整合了csh,提供更多的功能
sh已经给bash所替换
nologin这个shell可以让用户无法登陆主机

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

bash特性:

  1. 支持快捷键:比如 ctrl+c 强制终止进程 、 ctrl+l 清屏 、Tab补齐 等等。
  2. 支持查看历史命令(history)
  3. 支持别名(alias)
  4. 标准输入和标准输出的重定向
  5. 管道符
  6. 文件名通配机制
  7. 支持命令hash

这些功能都是bash特有的,其他shell环境没有这些功能,或者说没有这么全,所以bash取代sh成为了Linux的默认shell。

Shell脚本的构成

一.脚本声明(解释器):若第一行为“!/bin/bash”,代表此行以下的代码语句是通过/bin/bash程序来解释执行,#!/bin/bash为默认解释器。还有其它类型的解释器,比如#!/user/bin/python、#!/usr/bin/cxpcct

二.注释信息:以“#”开头的语句表示为注释信息,被注释的语句在运行脚本时不会被执行

三.可执行语句:比如echo命令

创建shell脚本
vim shell.sh
#!/bin/bash  
##声明解释器
#XXXXXXXX
##做脚本的注释信息
...
##用到的代码
shmod +x shell.sh

./shell.sh
#相对路径执行
/root/shell.sh
#绝对路径执行

image.png

运行脚本
  1. 会在脚本的字shell环境中执行脚本中的代码
    使用绝对路径或者相对路径指定脚本的路径运行,要求脚本文件必须要执行权限
    指定shell程序直接解释运行脚本:
    Bash  脚本文件
    Sh    脚本文件

  2. 会在当前的shell环境中执行脚本里的代码操作,也是脚本文件中的代码或者命令会影响当前shell环境
    Source 脚本文件

重定向操作和管道符

由于Shell脚本“批量处理”的特殊性,其大部分操作过程位于后台,不需要用户进行干预,因此要学会提取、过滤执行信息变得十分重要,所以我们需要重定向和管道

重定向

重定向的意思就是,不通过标准输出到默认屏幕上,而是输出到你指定的位置。

重定向操作:

image.png

示例: 给新建用户zhangsan加入密码

useradd zhangsan
echo "123456" > 1.txt
cat 1.txt
setenforce 0
passwd --stdin zhangsan <  1.txt

image.png

将“aaa"重定向输出到 fa.txt 文件中,之后将“bbb" 输出到 fa.txt 文件中,覆盖原有的”aaa";最后将“ccc"追加到 fa.txt 文件中

echo "aaa" > ava.txt
cat ava.txt
echo "bbb" > ava.txt
cat ava.txt
echo "ccc" >> ava.txt
cat ava.txt

image.png

管道符

  • 管道符的作用是连接两个命令,将第一个命令的标准输出作为第二个命令的标准输入

  • 同一行命令中可以使用多个管道符

  • linux下的管道符使用"竖杠"表示:| 。

image.png

linux的变量

变量的命名要求

变量名是以字母或下划线开头,不能以数字开头,区分大小写,建议全大写

  • 区分大小写
  • 不能使程序中的保留字和内置变量名称:如:if, for,hostname。
  • 只能使用数字、字母及下划线,且不能以数字开头,注意:不支持短横线 “ - ”,和主机名相反。
  • 使用英文时,尽量使用词义通俗易懂,如PATH。

Shell变量的作用和类型

变量的作用
变量是用来存放系统和用户需要使用的特定参数(值)
变量名:使用固定的名称,由系统预设或用户定义

示例:

变量名=变量值
A=1
a=1
Echo $a
Echo $A
Echo $a $A
#两次输出
Ecgi ${a}1
两次输出

Shell脚本给变量赋值的方式

  • 变量名=变量值

  • Read 获取标准输入的内容给变量,read只能赋一行的值
    -p #显示后面的提示的信息
    Read -p “请输入一个变量的值:”name

  • Echo $name

变量的作用范围:
默认情况下,新定义的变量只能在当前的shell环境中有效,因此称为局部变量

局部变量

定义变量:
变量名=变量值

查看变量:
echo $变量名:查看单个变量 image.png

特殊变量有:

  • 环境变量(全局变量):全局生效,在任何bash环境中都可以识别。:

  • 只读变量:read only, 只可以读取不可以更改 。

  • 位置变量: 通过命令行给脚本传递参数 。n(n是正整数),n(n是正整数),n(n是正整数),{10} 要加花括号。

  • 预定义变量:用来保持脚本程序的执行信息。

    • $0 :当前脚本名称(如果是软链接,显示当前软链接文件名)。
    • $? :查看上一次命令的执行状态,返回0为正常,非0为错误。
    • $* :返回所有参数,当整体返回。
    • $@ :返回所有参数,当个体返回。
    • $# :获取当前shell命令行中参数的总个数。
    • $_ :在此之前执行的命令或脚本的最后一个参数。
    • $$ :获取当前进程的PID。

删除变量

unset 变量名

环境变量

环境变量

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

使用env命令可以查看到当前工作环境下的环境变量

image.png

需要记住的常用环境变量:

  • $PATH 表示可执行文件的默认路径

  • $USER 表示用户名称

  • $HOME 表示用户的宿主目录

  • $LANG 表示语言和字符集

  • $PWD 表示当前所在工作目录

image.png

环境变量的特性:

  • 可以使子进程(包括孙子进程)继承父进程的变量,但是无法让父进程使用子进程的变量。
  • 一旦子进程修改从父进程继承的变量,将会新的值传递给孙子进程。
  • 一般只在系统配置文件中使用,在脚本中较少使用。

变量的值会取最后一次设置的变量值,变量的值不能有空格,但可以加引号‘’“”都行,输出的值就有空格

环境变量的全局配置文件为/etc/profile,在此文件中定义的变量作用于所有用户

只读变量

只读变量它不能修改值,也不能删除值,只保持原有值,改变值的方法是重启

代码:
Readonly 变量名=ava

image.png

位置变量

让shell脚本用传入参数的方式不用更改脚本也能得到其他的值

$n:n为数字,$0代表命令本身,$1-$9代表一到九的参数,
十以上的参数都需要大括号表示,
比如第十个参数要${10}来表示

image.png

预定变量

预定义变量是系统定义好的变量,用来保持脚本程序的执行信息。

可以直接使用这些变量,不能直接为这些变量赋值。 image.png $* 和 $@的区别:

  • 不加双引号的话,$* 和 $@ 都代表脚本后面跟的所有参数。
  • 加上双引号的话,"$*"会把所有参数当作一个整体去看待(此时参数数量为1),"$@"会把脚本后面跟的每一个参数当作一个个体去看待。
$*$@$0$_$$的作用

image.png

$?的作用 image.png