shell编程规范与变量

本文介绍了Shell脚本的基础知识,包括Shell的作用、编程规范、重定向与管道操作,以及变量的使用。通过学习,读者可以掌握如何创建和执行Shell脚本,理解重定向和管道在命令行中的应用,以及如何管理和使用Shell变量。此外,还详细阐述了环境变量、只读变量、位置变量和预定义变量等特殊变量的用法。
摘要由CSDN通过智能技术生成

目录

引言

shell

一、Shell脚本概述

1、什么是Shell

2、Shell的作用

二、Shell编程规范

1、创建Shell 程序的步骤

2、Shell脚本的构成

 先给text.sh添加执行权限

 相对路径

 绝对路径

 Sh 脚本路径

 source脚本文件路径

其他方法

 三、重定向与管道操作

1、交互式硬件设备

 2、重定向操作

 2.1 重定向操作

3、管道操作

四、Shell变量的作用、类型

1、变量的作用

2、变量的类型

3、自定义变量

3.1 引用变量

3.2 赋值时使用引号

3.3 交互式定义变量(read)

 3.4 设置变量的作用范围(export)

3.5 数值变量的运算

3.5.1 expr命令

 3.5.2 let命令

3.5.2 bc命令

五、特殊的Shell变量

1、环境变量

2、只读变量

3、位置变量

4、预定义变量

六、总结


引言

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

shell

一、Shell脚本概述

1、什么是Shell

  • Linux系统中运行的一种特殊程序
  • 在用户和内核之间之间充当“翻译官”
  • 用户登陆Linux系统时,自动加载一个Shell程序
  • Bash是Linux系统中默认使用的Shell程序

用户与内核进行交互过程如下:

  1. 计算机接收用户所输入的的命令
  2. shell会将所接收到的命令转换成计算机所能识别的二进制语言
  3. 再将命令传递给系统内核执行

2、Shell的作用

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

内核:用于调用计算机硬件资源
shell:将用户指令转换成计算机语言让内核去调用计算机硬件资源
bash是一个文件,linux系统中万物皆文件
bash文件位于/bin/bash

  • 注:
  • nologin:是奇怪的shell,这个shell可以让用户无法登录主机。
  • bash ( /bin/bash)是目前大多数Linux版本采用的默认shell。

二、Shell编程规范

1、创建Shell 程序的步骤

  1. 创建一个包含命令和控制结构的文件。
  2. 编辑完之后修改这个文件的权限使它可以执行 #使用chmod +x 文件名
  3. 检测语法错误(命令集合是否正确) #set -x 追踪脚本是否有故障
  4. 执行脚本./text.sh

2、Shell脚本的构成

第一行为“#!/bin/b2、Shell脚本的构成ash”,脚本申明(默认解释器):表示此行以下的代码语句是通过/bin/bash程序来执行。

还有其他类型的解释器,比如#!/usr/bin/python、#!/usr/bin/expect

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

可执行语句:如echo命令,用于输出“ ”之间的字符串

 先给text.sh添加执行权限

 相对路径

 绝对路径

 Sh 脚本路径

 source脚本文件路径

  • source命令也称为“点命令”,也就是一个点符号(.),是bash的内部命令
  • 不需要x权限,也需要使用相对路径或绝对路径

其他方法

sh < text.sh

或者

cat text.sh |sh(bash)

或者

bash text.sh

 

 三、重定向与管道操作

1、交互式硬件设备

  • 标准输入:从该设备接收用户输入的数据
  • 标准输出:通过该设备向用户输出数据
  • 标准错误:通过该设备报告执行出错信息

 2、重定向操作

 2.1 重定向操作

 2.2 错误重定向

错误重定向指的是将执行命令过程中出现的错误信息(如选项或参数错误等)保存到指 定的文件,而不是直接显示在屏幕上。错误重定向使用“2>”操作符

作用:

  • 在实际应用中,错误重定向可用来收集程序执行的错误信息,为排错提供依据
  • 还可以将无关紧要的错误信息重定向到空文件/dev/null 中,以保持脚本输出的简洁

使用“2>”操作符时,会像使用“>”操作符一样覆盖目标文件的内容,
若要追加内容而不是覆盖文件,则应改用“2>>”操作符

当命令输出的结果可能既包括标准输出(正常执行)信息,又包括错误输出信息时,可以使用操作符“>”“2>”将两类输出信息分别保存到不同的文件,也可以使用“&>”操作符将两类信息输出信息保存到同一个文件

/dev/null:把它看作"黑洞",所有写入它的内容都会永远丢失. 而尝试从它那儿读取内容则什么也读不到. 然 而 /dev/null 对命令行和脚本都非常的有用
echo kgc > /dev/null
cat /dev/null #什么信息也看不到

&>和>&符号
&表示等同于的意思
例1:把正确和错误的消息输入到相同的位置
1>&2 把标准输出重定向到标准错误
2>&1 把标准错误重定向到标准输出

cat /tmp error.txt >a.txt 2>&1 #查看erro.txt,把正确和错误的信息都放进a.txt

或:

cat /tmp error.txt 2>b.txt 1>&2

 2、把正确的和错误的信息都保存到一个文件(混合模式)

 3、另一种方法,把正确的和错误的信息都保存到一个文件(混合模式)

3、管道操作

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

在 Shell 脚本应用中,管道操作通常用来过滤所需要的关键信息。

  • $bash 表 示 系 统 提 示 符 , 表示系统提示符,表示系统提示符, 表示此用户为普通用户,超级用户的提示符是#
  • bash是shell的一种,是linux下最常用的一种shell
  • $bash的意思是执行一个子shell,此子shell为bash。

grep "^zhangsan" /etc/passwd | awk -F: '{print $1,$7}'

#打印出/etc/passwd下张三开头的

awk -F: '{print $1,$7}以冒号:分隔,输出第1和第7个字段,其中-F部分用来指定分隔符号

1、打印出/etc/passwd下张三开头的,并只显示第1和第7个字段

 2、打印出用户中可以登录shell的用户,并且只显示第1、6、7行,同一行命令中可以使用多个管道

 3、过滤出以根结尾的行

四、Shell变量的作用、类型

1、变量的作用

用来存放系统和用户需要使用的特定参数(值)

  • 变量名:使用固定的名称,由系统预设或用户定义
  • 变量值:能够根据用户设置、系统环境的变化而变化

2、变量的类型

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

3、自定义变量

变量名=变量值      #变量名以字母或下划线开头,区分大小写,建议全大写
 
echo $变量名      #查看变量的值

等号(=)用来给变量赋值

等号(=)运算符左边是一个变量名,等号(=)运算符右边是存储在变量中的值

 

3.1 引用变量

echo选项

  • echo-n表示不换行输出
  • 使用echo -e输出转义字符,将转义后的内容输出到屏幕上
  • 常用的转义字符如下:
    \c不换行输出,在"\c"后面不存在字符的情况下,作用相当于echo-n
    \n 换行
    \t 转义后表示插入tab,即制表符

:\转义符,跟在\之后的特殊符号将失去特殊含义,变为普通字符。如\s将输出“$”符号,而不当做是变量引用

3.2 赋值时使用引号

  • 双引号:允许通过$符号引用其他变量值
  • 单引号:禁止引用其他变量值, $视为普通字符
  • 反撇号:命令替换,提取命令执行后的输出结果,​​``​​​和$(…)作用相同

1、双引号允许通过$符号引用其他变量值

 2、单引号禁止引用其他变量值, $视为普通字符

 3、查找useradd的位置并列出其详细属性

ls -lh `which useradd`
#相当于连续执行两条命令,先通过which useradd命令查找出useradd命令的程序位置,然后根据查找结果列出文件属性

4、查询提供useradd命令程序的软件包所安装的配置文件的位置(从里到外先后执行替换)

 

5、查看当前日期

3.3 交互式定义变量(read)

read命令获取输入内容

-p:提示用户的信息
 
-n:定义字符数
 
-s:不显示用户输入的内容,常用于输入密码read -s -p "input your password:" pass
 
-t:定义超时时间,超过多长时间没输自动退出从文件读取内容赋值给变量(默认10s)    

stty -echo  //关闭屏幕回显
stty echo   //开启屏幕回显

1、从文本读取内容赋值给变量

read -p 提示信息 变量名
echo $变量名

 

 2、在脚本中编写,在命令行实现read获取

 

 3.4 设置变量的作用范围(export)

格式1:export 变量名
格式2:export 变量名=变量值
默认情况下,新定义的变量只在当前的Shell环境中有效,因此称为局部变量。当进入子程序或者新的子Shell环境时,局部变量将无法再使用。

例如:直接执行Bash进入下一个新的子Shell脚本后,将无法引用父级Shell环境中定义的变量

定义变量——查看当前定义的变量值 

 为了使用用户定义的变量在所有的子Shell环境中能够继续使用,减少重复设置工作,可以通过内部命令Export将指定的变量到处为全局变量。可以同时指定多个变量名称作为参数(不需要使用$符号),变量名之间以空格分隔。

 使用export导出全局变量的同时,也可以为变量进行赋值,这样在新定义全局变量时就不需要提前进行赋值。
例如:执行以下操作可以直接新建一个名为lc的全局变量

3.5 数值变量的运算

Shell变量的数值运算多用于脚本程序的过程控制。在Bash Shell环境中,只能进行简单的整数运算,不支持小数运算。整数值的运算主要通过内部命令expr进行,基本格式如下所示。需要注意的是,运算符与变量之间必须有至少一个空格。

  • 运算内容:加(+)、减(-)、乘(*)、除(/)、取余(%)
  • 运算符号:( ( ) ) 和 (( ))和(())和[]
  • 运算命令: expr和let
  • 运算工具: bc(计算器)

常用的几种运算符

3.5.1 expr命令

expr命令是一个手工命令行计数器,用于在UNIX/LINUX下求表达式变量的值,一般用于整数值,也可用于字符串。

整数变量的运算

expr 变量1 运算符 变量2 [运算符 变量3]...
常量运算

 变量运算

 使用脚本执行

 

 3.5.2 let命令

let 命令是 BASH 中用于计算的工具,用于执行一个或多个表达式,变量计算中不需要加上 $ 来表示变量。如果表达式中包含了空格或其他特殊字符,则必须引起来。

let n++        #n自加1
let n--        #n自减1
 
[n++]      #先输出后执行
[++n]      #先执行后输出

 

 

3.5.2 bc命令

bc 命令是任意精度计算器语言,通常在linux下当计算器用。

直接使用bc会进入交互界面

 可以用echo结合管道使用命令
scale=4 设小数位,3 代表保留四位:
sqrt表示开平方根

bc 除了 scale 来设定小数位之外,还有 ibase 和 obase 来其它进制的运算

进制转换

 

五、特殊的Shell变量

1、环境变量

  • 由系统提前创建,用来设置用户的工作环境
  • 配置文件:/etc/profile(全局配置文件) 、~/.bash_profile(用户的独立配置文件)

常用的环境变量

已经将该目录添加到路径环境变量中,目录内的所有具有执行权限的文件,都可以在当前环境任何目录中执行 。
例如:text.sh脚本位于/root目录下,若希望能直接通过文件名称来运行脚本,可以修改PATH变量以添加搜索路径,或者将text.txt脚本复制到现有搜索路径中的某个文件夹下。

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

2、只读变量

用于变量值不允许被修改的情况

readonly 命令设置只读变量
readonly PRODUCT        #设置为只读变量
echo $PRODUCT
PRODUCT=Python              #只读变量不可以被重新赋值
unset PRODUCT         #只读变量不可以被删除,unset 命令用于删除变量,但无法删除只读变量,只能重启系统解决

3、位置变量

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

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

例1:编写一个创建用户的脚本,通过位置变量来实现

 例2:编写一个加法运算的脚本,用来计算两个整数的和。

4、预定义变量

预定义变量是由Bash程序预先定义好的一类特殊变量,用户只能使用预定义变量,而不能创建新的预定义变量,也不能直接为预定义变量赋值。预定义变量使用*$"符号和另一个符号组合表示,较常用的几个预定义变量的含义如下。

$#:  表示命令行中位置参数的个数。

$*:  表示所有位置参数的内容,这些内容当做一个整体
 
$@: 表示列出所有位置参数,但是是以单个的形式的列出
 
$?: 表示前一条命令执行后的返回状态,返回值为0表示执行正确,返回任何非0值均表示执行出现异常。
 
$0:表示当前执行的脚本或程序的名称
 
$$:表示返回当前进程的进程号
 
$ !:返回最后一个后合进程的进程号

六、总结

  • Shell脚本的内容构成:环境声明、注释文字、执行语句
  • 重定向包括重定向输入、重定向输出、错误重定向
  • 定义或赋值变量时,采用“变量名=变量值”的格式
  • 赋值操作还可以使用单引号、双引号、反撇号、read命令等方式
  • 查看或引用变量的值时,采用“$变量名”的格式
  • 常见的特殊变量包括环境变量、只读变量、位置变量、预定义变量
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值