shell编程规范与变量

一、shell脚本概述

shell脚本的概念

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

shell脚本应用场景

  • 重复性操作
  • 交互性任务
  • 批量事务处理
  • 脚本运行状态监测
  • 定时任务执行
    简单来说,将平时使用的各种linux命令按顺序保存到一个文本文件,添加可执行权限,从而完成更复杂的操作,就是shell脚本。

shell的作用

  • 命令解释器,“翻译官”

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

    • 用户输入→shell→Linux内核→硬件→反馈用户
      在这里插入图片描述
  • 用户的登录shell

    • 登录后默认使用的shell程序,一般为/bin/bash
    • 不同shell的内部指令、运行环境等会有所区别
[root@localhost ~]# cat /etc/shells  ##可以查看本机可以使用的shell程序
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh

二、编写一个shell脚本

编写脚本代码:

  • 使用vim文本编辑器(vim能检查语法结构,编写是否存在问题)
  • 每一条linux命令,按执行顺序编写
赋予可执行权限:使脚本具有可执行属性
chmod +x [文件名]
[root@localhost ~]# vim test.sh  ##编写一个脚本,以.sh结尾

#!/bin/bash    ##固定写法
#this is my test shell   ##注释信息
cd /opt
echo "当前的位置在:"  ## 输出友好信息
pwd
echo "其中以r开头的文件包括:"  ## 输出友好信息
ls -l r*

完善的脚本构成包括
脚本声明 #!/bin/bash
注释信息 # 注释信息
可执行语句

执行方法

方法一:sh 脚本文件路径 (不需要执行权限)

方法二:./脚本文件路径 (需要执行权限来操作)

方法三:source 脚本文件路径 (也不需要执行权限)

实验案例

[root@localhost ~]# sh test.sh 
当前的位置在:
/opt
其中以r开头的文件包括:
-rw-r--r--. 1 root root 85 1116 23:27 r1.txt
-rw-r--r--. 1 root root  9 1116 23:28 r2.txt
-rw-r--r--. 1 root root 14 1116 23:29 r3.txt

rh:
总用量 0
[root@localhost ~]# chmod +x test.sh 
[root@localhost ~]# ./test.sh 
当前的位置在:
/opt
其中以r开头的文件包括:
-rw-r--r--. 1 root root 85 1116 23:27 r1.txt
-rw-r--r--. 1 root root  9 1116 23:28 r2.txt
-rw-r--r--. 1 root root 14 1116 23:29 r3.txt

rh:
总用量 0
[root@localhost ~]# source test.sh 
当前的位置在:
/opt
其中以r开头的文件包括:
-rw-r--r--. 1 root root 85 1116 23:27 r1.txt
-rw-r--r--. 1 root root  9 1116 23:28 r2.txt
-rw-r--r--. 1 root root 14 1116 23:29 r3.txt

rh:
总用量 0

三、重定向

  • 标准输入(STDIN)
    • 默认的设备是键盘,文件编号为0,命令将从标准输入文件中读取在执行过程需要的输入数据。
  • 标准输出(STDOUT)
    • 默认的设备是显示器,文件编号为1,命令将执行后的输出结果发送到标准输出文件。
  • 标准错误(STDERR)
    • 默认设备是显示器,文件编号为2,命令将执行期间的各种错误信息发送到标准错误文件。

交互式硬件设备

类型设备文件文件描述编号默认设备
标准输入/dev/stdin0键盘
标准输出/dev/stdout1显示器
标准错误输出/devlstderr2显示器

使用场景

  • 标准输入、标准输出和标准错误默认使用键盘和显示器作为关联的设备,与操作系统进行交互,完成最基本的输入、输出操作,即从键盘接收用户输入的各种命令字串、辅助控制信息,并将命令结果输出到屏幕上;如果命令执行出错,也会将错误信息反馈到屏幕上。

  • 在实际的Linux系统维护中,可以改变输入、输出内容的方向,而不适用默认的标准输入、输出设备(键盘和显示器),这种操作称为重定向。

重定向操作

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

重定向输入

vi pass.txt
useradd lisi
passwd --stdin lisi < pass.txt      #更改用户lisi的密码

重定向输出

[root@localhost ~]# yum -y install http > http.txt 
Repository base is listed more than once in the configuration
Repository updates is listed more than once in the configuration
Repository extras is listed more than once in the configuration
Repository centosplus is listed more than once in the configuration
错误:无须任何处理
[root@localhost ~]# cat http.txt 
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * epel: mirrors.bfsu.edu.cn
没有可用软件包 http。

标准错误输出

[root@localhost ~]# yum -y install http 2> http.txt 
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * epel: my.mirrors.thegigabit.com
没有可用软件包 http。
[root@localhost ~]# cat http.txt 
Repository base is listed more than once in the configuration
Repository updates is listed more than once in the configuration
Repository extras is listed more than once in the configuration
Repository centosplus is listed more than once in the configuration
错误:无须任何处理

混合输出

[root@localhost ~]# yum -y install http &> http.txt 
[root@localhost ~]# cat http.txt 
已加载插件:fastestmirror, langpacks
Repository base is listed more than once in the configuration
Repository updates is listed more than once in the configuration
Repository extras is listed more than once in the configuration
Repository centosplus is listed more than once in the configuration
Loading mirror speeds from cached hostfile
 * epel: mirrors.bfsu.edu.cn
没有可用软件包 http。
错误:无须任何处理

补充:

  • 1.当不知道执行的操作是对的还是错的时候用混合输出。
  • 2.yum -y install httpd &> /dev/null 黑洞,信息保存进去就消失了,不希望出现提示信息时可以用
  • /dev/zero文件可以理解为取之不尽的垃圾文件

管道操作

管道操作符号 “|”
将左侧的命令输出结果,作为右侧命令的处理对象。

[root@localhost ~]# grep "bash$" /etc/passwd 
root:x:0:0:root:/root:/bin/bash
amandabackup:x:33:6:Amanda user:/var/lib/amanda:/bin/bash
hy:x:1000:1000:hy:/home/hy:/bin/bash
[root@localhost ~]# grep "bash$" /etc/passwd | awk -F: '{print $1,$7}'
root /bin/bash
amandabackup /bin/bash
hy /bin/bash
[root@localhost ~]# df -Th
文件系统                类型      容量  已用  可用 已用% 挂载点
/dev/mapper/centos-root xfs        50G   12G   39G   24% /
devtmpfs                devtmpfs  897M     0  897M    0% /dev
tmpfs                   tmpfs     912M     0  912M    0% /dev/shm
tmpfs                   tmpfs     912M  9.1M  903M    1% /run
tmpfs                   tmpfs     912M     0  912M    0% /sys/fs/cgroup
/dev/sr0                iso9660   4.3G  4.3G     0  100% /mnt
/dev/sda1               xfs      1014M  179M  836M   18% /boot
/dev/mapper/centos-home xfs        27G   33M   27G    1% /home
tmpfs                   tmpfs     183M   12K  183M    1% /run/user/42
tmpfs                   tmpfs     183M     0  183M    0% /run/user/0
[root@localhost ~]# df -Th | awk '{print $1,$6}'
文件系统 已用%
/dev/mapper/centos-root 24%
devtmpfs 0%
tmpfs 0%
tmpfs 1%
tmpfs 0%
/dev/sr0 100%
/dev/sda1 18%
/dev/mapper/centos-home 1%
tmpfs 1%
tmpfs 0%

补充:

  • awk 按列搜索过滤出所需内容,过滤文件每列以空格和制表符分割:不加-F选项,以:分割,加-F:
  • print输出 &1 &7 第一列和第七列

四、Shell变量的作用、类型

4.1变量的作用

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

4.2变量的类型

  • 自定义变量:由用户自己定义、修改和使用
  • 特殊变量:环境变量,只读变量,位置变量,预定义变量
    • 注意:
    • 1.变量的值是存储在内存中的(所有重启就没了)
    • 2.两种永久保存方法:存到文件或者存到数据库中

4.3自定义变量

  • 定义一个新的变量
    • 变量名必须以字母或下划线开头,区分大小写,建议大小写
      格式:
      变量名=变量值 (变量名在左,= 叫赋值符号)
  • 查看变量的值
    • echo 变 量 名 ( 调 用 变 量 必 须 变量名 (调用变量必须变量名(调用变量必须开头)
  • 赋值时引号的用法
    • 双引号:允许通过符 号 引 用 其 他 变 量 值 单 引 号 : 禁 止 引 用 其 他 变 量 值 , 符号引用其他变量值 单引号:禁止引用其他变量值,符号引用其他变量值单引号:禁止引用其他变量值,视为普通字符
    • 反撇号:命令替换,提取命令执行后的输出结果
    • 反撇号中间加命令=$(命令)

在这里插入图片描述
在这里插入图片描述

  • 从键盘输入内容为变量赋值(交互式)
    read 【-p “提示信息”】变量名

在这里插入图片描述

  • 变量数据类型

    • 数值:
    • 整型 int 4字节 例如:0 1 10 10001
    • 浮点型 float 单精度浮点 4字节
      double 双精度浮点 8字节
      例如:10.1 3.14 10.0
  • 非数值:

    • 字符 char 1字节或2字节 英文1字节;中文2字节 出现字符集问题,支持中文需要UTF-8
    • java语言 字母 2字节
      例如:‘a’ ‘z’ ‘男‘ ‘女’
      字符串 字符的集合 例如:“hello world” (空格算一个字符的)
      字符串的处理规则 正则表达式
      布尔值 true成立 false不成立 判断条件成立与否 条件语句 循环语句
  • 设置变量的作用范围
    格式1:export 变量名
    格式2:export 变量名=变量值
    (export是全局声明变量,换了bash环境依然可以调用)

在这里插入图片描述
整数变量的运算

格式:
expr 变量1 运算符 变量2 [运算符 变量3]
  • 常用运算符
  • 加法运算:+
  • 减法运算:-
  • 乘法运算:*
  • 除法运算:/
  • 求模(取余)运算:%
    5/2=2
    5%2=1

4.4特殊的shell变量

环境变量

  • 由系统提前创建,用来设置用户的工作环境
  • 配置文件:
    /etc/profile:系统环境变量,针对所有用户
    ~/.bash_profile:用户环境变量,只针对当前用户
  • 常见的环境变量
    export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE
  • 只读变量
    用于变量值不允许被修改的情况
    在这里插入图片描述
    只读变量重启就没了,或者换个bash环境(前提是没声明为全局变量)
  • 位置变量
    表示为$n,n为1~9之间的数字(只针对脚本,执行的脚本本身为$0)

在这里插入图片描述

在这里插入图片描述

  • 预定义变量
    • $#:命令行中位置变量的个数

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

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

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

    • date +%s 一种时间格式,从1970年1月1日到现在,按秒计

在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值