当前位置: 首页 > news >正文

Shell编程规范与变量

一.Shell脚本概述

        在一些复杂的 Linux 维护工作中,大量重复性的输入和交互操作不仅费时费力,而且容 易出错,而编写一个恰到好处的 Shell 脚本程序,可以批量处理、自动化地完成一系列维护 任务,大大减轻管理员的负担。

1.shell的作用

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

        常见的shell解释器有多种  ,不同的解释器,其内部指令,命令行提示符等方面会存在一些区别,下面命令可以了解当前系统支持的shell脚本种类。  

 2.shell脚本的格式与使用

        首先随便创建一个文件,然后vim编辑器进行编辑,将要执行的命令按顺序写入其中,最好是在一条命令上方加“echo "解释下方内容的字段"”,使用bash 脚本名 执行脚本

[root@localhost ~]# vim frist.sh
echo "进入boot目录"
cd /boot/
echo "查看当前所在的位置"
pwd
echo "其中以vml开头的文件包括"
ls -lh vml*
[root@localhost ~]# bash frist.sh 
进入boot目录
查看当前所在的位置
/boot
其中以vml开头的文件包括
-rwxr-xr-x. 1 root root 6.5M 4月  21 01:15 vmlinuz-0-rescue-835eee3378df4310a7c5ee65d4766a3f
-rwxr-xr-x. 1 root root 6.5M 10月 20 2020 vmlinuz-3.10.0-1160.el7.x86_64

除了上诉使用bash执行脚本外还可以使用“sh 脚本路径”通过解释器来解释脚本,“. 脚本路径”或“source 脚本路径”加载脚本,以及 使用“./脚本路径”执行脚本,使用此方法文件本身要具有x(执行)权限

3.重定向

        用户通过操作系统处理信息的过程中,包括3类交互设备文件:

  • 标准输入(STDIN):默认的设备是键盘,文件编号为0,命令将从标注输入文件中读取在执行过程中需要的输入数据
  • 标准输出(STDOUT):默认的设备是显示器,文件编号1,命令将执行后的输出结果发送到标准输出文件
  • 标准错误(STDERR):默认的设备是显示器,文件编号为2,命令将执行期间的各种错误信息发送到标准错误文件。
        在实际的 Linux 系统维护中,可以改变输入、输出内容的方向,而不使用默认的标准输 入、输出设备(键盘和显示器),这种操作称为重定向。
        (1)重定向输出
充定向输出值得是将命令的正确输出结果保存到指定的文件中,而不是直接显示在显示器的屏幕上。重定向输出使用“>”或“>>”操作符号,分别用于覆盖和追加文件。若重定向文件不出在,则会新建该文件,然后将前面命令的输出内容保存到该文件中,若已存在,则将输出结果覆盖或追加到文件中,若需要呀保留原文件改用“>>”操作符号。
[root@localhost ~]# uname -p > kernel.txt
[root@localhost ~]# cat kernel.txt
x86_64[root@localhost ~]# uname -r >> kernel.txt
[root@localhost ~]# cat kernel.txt
x86_64
3.10.0-514.el7.x86_64
        (2)重定向输入
        重定向输入指的是将命令中接收输入的途径由默认的键盘改为指定的文件,而不是等待从键盘输入。重定向输入使用“<” 操作符。
        (3)重定向错误
        错误重定向指的是将执行命令过程中出现的错误信息(如选项或参数错误等)保存到指定文件,而不是直接显示在屏幕上。错误重定向使用“2>” 操作符,其中 “2” 是指错误文件的编号(在使用标准输出、标准输入重定向时,实际上省略了 1 0 编号)。
操作命令 2> 文件位置  //覆盖
操作命令 2>> 文件位置  //追加

4.管道操作

        管道(pipe)操作为不同命令之间的协同工作提供了一种机制,位于管道符号“|”左侧的命令输出的结果,将作为右侧命令的输入(处理对象),同一行命令中可以使用多个管道。

[root@localhost ~]# grep "/bin/bash$" /etc/passwd                         //提取之前
root:x:0:0:root:/root:/bin/bash
bdqn:x:1000:1000:bdqn:/home/bdqn:/bin/bash
tsengyia:x:1002:1002::/home/tsengyia:/bin/bash
jerry:x:1003:1003::/home/jerry:/bin/bash
lisi:x:1004:1004::/home/lisi:/bin/bash[root@localhost ~]# grep "/bin/bash$" /etc/passwd | awk -F: '{print $1,$7}' //提取之后
root /bin/bash
bdqn /bin/bash
tsengyia /bin/bash
jerry /bin/bash
lisi /bin/bash

        上例中啊awk命令的作用是以冒号“:”进行分割,输出第一个,第七个区域的字符串。其中的“-F”部分用来指定分割符号(未指定时,默认以空格或制表符分隔)

二.Shell变量的作用,类型

1.作用

        Shell变量用来存放系统和用户需要使用额特定参数,而且这些参数可以根据用户用户的设定或环境的变化而变化,通过使用Shell变量,Shell程序能够提供更加灵活的功能,实用性更强。

2.类型

(1)自定义变量
        自定义变量是由系统用户自己定义的变量,只在用户自己的 Shell 环境中有效,因此又称为本地变量。在编写 Shell 脚本程序时,通常会设置一些特定的自定义变量,以适应程序执行过程中的各种变化,满足不同的需要。
格式:变量名=变量值
查看变量值:echo 变量名1,变量名2....
引用变量: $变量名(当变量名后紧跟其他内用时要用{}将变量名包裹起来)
变量赋值的特殊操作
1.双引号("")
        双引号主要起界定字符串的作用,特别是当要赋值的内容中包含空格时,必须以双引号括起来;其他情况下双引号通常可以省略;在双引号范围内可以使用“$”引用其他变量
2.单引号(' ')
        当要赋值的内容中包含$、“、\等具有特殊含义的字符时,应使用单引号括起来。在单引号的范围内,将无法引用其他变量的值,任何字符均作为普通字符看待。但赋值内容中包含单引号(‘)时,需使用\’符号进行转义,以免冲突。
3.反撇号(`)
        反撇号主要用于命令替换,允许将执行某个命令的屏幕输出结果赋值给变量。反撇号括起来的范围内必须是能够执行的命令行,否则将会出错。
4.$()
        使用反撇号难以在一行命令中实现嵌套命令替换操作,这时可以改用 “$()”来代替反撇号操作,以解决嵌套的问题。
5.read命令
使用 Bash 的内置命令 read 来给变量赋值。 read 命令用来提示用户输入信息,从而实现简单的交互过程。执行时将从标准输入设备(键盘)读入一行内容,并以空格为分隔符,将读入的各字段依次赋值给指定的变量(多余的内容赋值给 最后一个变量)。若指定的变量只有一个,则将整行内容赋值给此变量;read 命令可以结合“-p”选项来设置提示信息,以便告知用户应该输入什么内容等相关事项
[root@localhost ~]# read -p "请指定备份存放目录:" ToDir2
请指定备份存放目录:/opt/backup
[root@localhost ~]# echo $ToDir2
/opt/backup

6.设置变量的作用范围

        默认情况下,新定义的变量只在当前的 Shell 环境中有效,因此称为局部变量。子程序或新的子 Shell 环境时,局部变量将无法再使用;为了使用户定义的变量在所有的子 Shell 环境中能够继续使用,减少重复设置工作,可以通过内部命令 export 将指定的变量导出为全局变量。用户可以同时指定多个变量名称作为参数(无须使用“$”符号),变量名之间以空格分隔;使用 export 导出全局变量的同时,也可以为变量进行赋值,这样在新定义全局变量时就不需要提前进行赋值了。
7.数值变量的运算
        在 Bash Shell 环境中,只能进行简单的整数运算,不支持小数运算。整数值的运算主要通过内部命令 expr 进行。
格式: expr 变量 1 运算符 变量 2 [ 运算符 变量 3]…
常用的运算符:
  • +:加法运算。
  •  -:减法运算。
  •  \*:乘法运算,注意不能仅使用“*”符号,否则将被当成文件通配符。
  • /:除法运算。
  •  %:求模运算,又称为取余运算,用来计算数值相除后的余数
(2)环境变量
        环境变量指的是出于运行需要而由 Linux 系统提前创建的一类变量,主要用于设置用户的工作环境,包括用户宿主目录、命令查找路径、用户当前目录、登录终端等。环境变量的值由 Linux 系统自动维护,会随着用户状态的改变而改变。
        使用 env 命令可以查看到当前工作环境下的环境变量,对于常见的一些环境变量应了解其自的用途。例如,变量 USER 表示用户名称, HOME 表示用户的宿主目录, LANG表示语言和字符集,PWD 表示当前所在的工作目录, PATH 表示命令搜索路径等。
        其中PATH 变量用于设置可执行程序的默认搜索路径,当仅指定文件名称来执行命令程序时,Linux 系统将在 PATH 变量指定的目录范围查找对应的可执行文件,如果找不到则会提示“command not found”。
        例如,first.sh 脚本位于 /root 目录下,若希望能直接通过文件名称 来运行脚本,可以修改 PATH 变量以添加搜索路径,或者将 first.sh 脚本复制到现有搜索路 径中的某个文件夹下。
[root@localhost ~]# ls -lh /root/first.sh         //确认脚本位置
-rwxr-xr-x. 1 root root 27 Jul 4 09:24 /root/first.sh[root@localhost ~]# echo $PATH                     //查看当前搜索路径
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/mysql/bin:/root/bin
[root@localhost ~]# first.sh                         //直接执行时找不到命令
-bash: first.sh: command not found
[root@localhost ~]# PATH="$PATH:/root"             //将/root 添加到搜索路径
[root@localhost ~]# echo $PATH                     //查看修改后的搜索路径
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/mysql/bin:/root/bin:/root
[root@localhost ~]# first.sh                     //直接以文件名运行脚本
当前的目录位于:
/boot
其中以 vml 开头的文件包括: 
-rwxr-xr-x. 1 root root 5.2M Apr 12 13:20
vmlinuz-0-rescue-b15df1eb8205483f9f70c79709810abc
-rwxr-xr-x. 1 root root 5.2M Nov 22 2016 vmlinuz-3.10.0-514.el7.x86_64
        在 Linux 系统中,环境变量的全局配置文件为 /etc/profile ,在此文件中定义的变量作用于所有用户。除此之外,每个用户还有自己的独立配置文件(~/.bash_profile )。若要长期变更或设置某个环境变量,应在上述文件中进行设置。例如,执行以下操作可以将记录的历 史命令条数改为 200 条(默认为 1000 条),只针对 root 用户。
[root@localhost ~]# vim /root/.bash_profile 
…… //省略部分内容
export HISTSIZE=200

         上述修改只有当 root 用户下次登录时才会生效。若希望立即生效,应手动修改环境变量,或者可以加载配置文件执行。

[root@localhost ~]# history | wc -l
356                                                 //已经记录的历史命令条数
[root@localhost ~]# source /root/.bash_profile     //读取并执行文件中的设置
[root@localhost ~]# history | wc -l
200                                                 //修改后的历史命令条数
(3)只读变量
        Shell 变量中有一种特殊情况,一经设定,其值是不可改变的,这种变量被称为只读变量。在创建变量的时候可将其设置为只读属性,也可以将已存在的变量设置为只读属性,只读变量主要用于变量值不允许被修改的情况。例如脚本中定义了一个变量“log_path” 用来定义日志文件的路径,在脚本的执行过程中如果不想被修改,就可以将该变量设置为只读变量。使用 readonly 命令将变量定义为只读变量,定义之后不能通过再次赋值的方式进行修改。
[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
(4)位置变量
        为了在使用 Shell 脚本程序时,方便通过命令行,为程序提供操作参数, Bash 引入了位置变量的概念。当执行命令行操作时,第一个字段表示命令名或脚本程序名,其余的字符串参数按照从左到右的顺序依次赋值给位置变量。
        位置变量也称为位置参数,使用$1、 $2 $3 $9 表示。 例如,当执行命令行“ls -lh
/boot/” 时,其中第 1 个位置变量为 “-lh” ,以 “$1” 表示;第 2 个位置变量为 “/boot/” ,以 “$2” 表示。命令或脚本本身的名称使用“$0” 表示,虽然 $0 与位置变量的格式相同,但是 $0 属于预定义变量而不是位置变量。
[root@localhost ~]# vim adder2num.sh
#!/bin/bash
SUM=`expr $1 + $2` echo "$1 + $2 = $SUM"
[root@localhost ~]# chmod +x adder2num.sh
[root@localhost ~]# ./adder2num.sh 12 34 //$1 为 12、$2 为 34 的情况
12 + 34 = 46
(5)预定义变量
        预定义变量是由 Bash 程序预先定义好的一类特殊变量,用户只能使用预定义变量,而不能创建新的预定义变量,也不能直接为预定义变量赋值。预定义变量使用“$” 符号和另一个符号组合表示,较常用的几个预定义变量的含义如下。
  • $#:表示命令行中位置参数的个数
  • $*:表示所有位置参数的内容
  • $?:表示前一条命令执行后返回的状态,返回值为0表示执行正确,返回值非0的值表示执行异常。
  • $0:表示当前执行的脚本或程序的名称

相关文章:

  • VMware安装Windows11
  • ISCC——AI
  • getters的使用
  • uniapp开发微信小程序问题集锦(1)
  • Hadoop概览以及编译hadoop说明
  • SpringBoot高级原理详解
  • 【MyBatis】MyBatis解析全局配置文件源码详解
  • 深度神经网络详解
  • 同旺科技 FLUKE ADPT 隔离版发布 ---- 3
  • pycharm配置python开发环境—miniconda+black+gitlab
  • 【sass插值语句 #{}简介以及使用方法】
  • TG5032CGN TCXO 超高稳定10pin端子型适用于汽车动力转向控制器
  • 以及Spring中为什么会出现IOC容器?@Autowired和@Resource注解?
  • js 实现贪心算法
  • 国内服务器未备案使用域名443访问的方法
  • Java 实战开发之spring、logback配置及chrome开发神器(六)
  • JavaScript DOM 10 - 滚动
  • JavaScript中的对象个人分享
  • KMP算法及优化
  • mysql_config not found
  • pdf文件如何在线转换为jpg图片
  • PHP 小技巧
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • 安卓应用性能调试和优化经验分享
  • 表单中readonly的input等标签,禁止光标进入(focus)的几种方式
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 从PHP迁移至Golang - 基础篇
  • 今年的LC3大会没了?
  • 深度学习入门:10门免费线上课程推荐
  • 深入 Nginx 之配置篇
  • 用 Swift 编写面向协议的视图
  • ​DB-Engines 12月数据库排名: PostgreSQL有望获得「2020年度数据库」荣誉?
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • (21)起落架/可伸缩相机支架
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (k8s)Kubernetes 从0到1容器编排之旅
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (附源码)spring boot校园健康监测管理系统 毕业设计 151047
  • (附源码)ssm考生评分系统 毕业设计 071114
  • (南京观海微电子)——I3C协议介绍
  • (十五)Flask覆写wsgi_app函数实现自定义中间件
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (四)图像的%2线性拉伸
  • (转)IOS中获取各种文件的目录路径的方法
  • (转载)从 Java 代码到 Java 堆
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
  • .NET MAUI学习笔记——2.构建第一个程序_初级篇
  • .NET 除了用 Task 之外,如何自己写一个可以 await 的对象?
  • /proc/interrupts 和 /proc/stat 查看中断的情况
  • [240621] Anthropic 发布了 Claude 3.5 Sonnet AI 助手 | Socket.IO 拒绝服务漏洞
  • [Avalon] Avalon中的Conditional Formatting.
  • [C++从入门到精通] 14.虚函数、纯虚函数和虚析构(virtual)
  • [CISCN2019 华北赛区 Day1 Web2]ikun
  • [Git][分支设计规范]详细讲解