Shell脚本学习指南

本文详述了Shell脚本的基础知识,包括Shell的定义、常见类型、查询与切换环境的方法,以及变量的分类与使用。内容涵盖本地变量、环境变量、位置变量和特殊变量的定义、引用、赋值及运算。还介绍了echo和printf命令,以及如何通过read命令从控制台获取输入。文章深入讨论了条件测试表达式,包括文件状态、整数值、字符串和逻辑测试的比较,并探讨了if判断语句的多种形式。循环控制语句部分讲解了for、while、until循环以及break、continue和exit的使用。最后,文章提到了选择语句case和select的应用,以及Shell函数的定义、参数传递、返回值和调用。
摘要由CSDN通过智能技术生成

目录

一、Shell脚本基础知识

1、什么是Shell脚本?

在学习Shell脚本之前,首先需要明白Shell脚本到底是什么。Shell脚本简单来说就是一个命令解释器,它是介于操作系统内核与用户之间,负责将用户输入的命令传递给系统内核进行执行,然后将结果输出到终端上给用户。其作用相当于一个“翻译官”。Shell脚本是偏向于操作系统层面的脚本编程语言,相对于其他高级编程语言,Shell脚本更加适合对系统方面进行管理。

2、常见的Shell类型

在Linux系统中,常见的Shell类型有Bash、Bsh(sh)、Csh、Dash、Ksh、Rbash和Zsh

.Bash是Bourne Again Shell的缩写,是为GNU项目设计的,是Linux发行版默认使用的Shell。
.Bsh(sh)是Bourne Shell的缩写,是较早的UNIX Shell程序,实现了最基本的命令解释功能。
.Csh是C shell的缩写,使用的是“类C”语法,具备C语言的风格,共有52个内部命令,它在交互式界面方面改进了许多,更多适合用户操作。
.Dash是Debian Almquist shell的缩写,Dash Shell比Bash Shell小的多,符合POSIX标准。
.Ksh是Korn Shell的缩写,它结合Bsh和Csh的优点,基于Bsh的源代码发展而来,在UNIX系统中使用较多。
.Rbash是是Resticted Bash的缩写,即受限制的bash。其可以用作中转服务器,或者仅使用ssh来访问网页等等。
.Zsh是Z Shell的缩写,有84个Linux内部命令,添加了Bash、Csh和Ksh的特性,命令功能完善,会逐步成为Bash的替代品。

3、如何查询Shell环境

以ubunut系统为例讲解如何查询该系统支持的Shell环境。

1)使用cat命令查看配置文件/etc/shells可以查看当前系统支持的Shell环境

在这里插入图片描述

2)通过环境变量SHELL或者用户配置文件/etc/passwd可以查询当前用户的Shell环境

在这里插入图片描述

4、如何切换Shell环境

在使用系统的过程中,如果用户需要使用不同的Shell环境去操作命令,可以通过临时切换和永久修改两种方式实现。永久修改方式需要重启之后才能生效。

1)临时切换

临时切换用户的Shell环境只是临时调用,重启之后就失效了,可以通过/etc/shells文件查询系统支持的Shell环境,在Linux中直接使用Shell名或者绝对路径。

将当前用户的Shell环境从bin/bash切换成/bin/sh,使用Shell名或者绝对路径:
在这里插入图片描述
在这里插入图片描述

使用exit命令返回原来的Shell环境:
在这里插入图片描述

2)永久修改

如果要将用户的Shell环境永久修改,可以通过usermod和chsh两条命令来实现,其中Shell名一定要使用绝对路径加名称(可以通过查询/etc/shells文件获取)。注意,需要重启用户之后用户下次登录时才会生效。命令格式如下:
usermod -s Shell名 用户名
usermod -s Shell名 用户名

使用usermod命令修改zxw用户的Shell环境为/bin/sh:
在这里插入图片描述
使用chsh命令修改zxw用户的Shell环境为/bin/sh:
在这里插入图片描述

5、Shell变量

在编写Shell脚本时需要用到Shell变量。变量通常使用特定的字符(一般是以下划线或字母开头)表示,它用来存储数据,只不过这些数据是随着系统或用户设定的变化而变化的。变量的赋值采用表达式的方式,即“变量名=变量值”,其中等于号“=”表示赋值,意思是将右边的变量赋值给左边的变量名。
在Shell脚本中变量主要分为4类,即本地变量、环境变量、位置变量和特殊变量。
在介绍Shell变量之前,首先熟悉下几条命令的使用方式

echo命令

echo命令除了能够在屏幕上打印输出信息外,还可以输出变量的值。命令格式如下:
echo [选项] 字符串[特殊符号]
常用选项如下:
-n:打印输出不换行
-e:启用特殊符号(转义符)

在这里插入图片描述
示例:
#-n选项的使用:输出不换行,第一个是不使用“-n”的效果,第二个是使用“-n”的效果

在这里插入图片描述
#使用转义符
\b:退格,光标前移一格,并将之后的内容覆盖输出,其后无内容时,不覆盖本来已有内容。如图,a向前移一格,并覆盖3。
在这里插入图片描述
\c:不执行其后的内容输出,也不自动换行。如图,test后面的内容不输出,只输出test。
在这里插入图片描述
\n:换行。如图,输出test之后并换行输出123。
在这里插入图片描述
\r:回车,其后内容移至行首输入,覆盖之前的输入。如图,后面的内容ab移至行首输入,覆盖之前的内容12,输出结果ab3。
在这里插入图片描述
\v:垂直制表符。
在这里插入图片描述
\0nnn:插入nnn所代表的ASCII字符,n为八进制数字。大写A的ASCII值为65。下面使用进制数的转换。
在这里插入图片描述

printf命令

printf命令的特定在于能够控制输出的格式,因此在编写Shell脚本时,某些场景也会使用printf命令。命令格式如下:
printf 格式 字符串[特殊符号]
printf命令的常用类型转换符说明如下:
在这里插入图片描述
示例:
#使用转义符
\n:换行。
在这里插入图片描述
#类型转换符
使用%d、%.2f、%o和%x将参数12分别转换为十进制数、带两位小数的浮点数、八进制数和十六进制数、结合转义符“\n”实现换行输出
在这里插入图片描述
言归正传,我们来了解下Shell脚本的四种变量。

1)本地变量

本地变量就是用户自己定义的变量,也称为自定义变量,只在当前用户的Shell环境中生效。如果在Shell中启动另外一个进程或者退出一个进程,这个变量就失效了。

a.定义变量

变量名一般以下划线或字母开头,名称由字母、数字和下划线组合而成,通过表达式的形式定义,格式如下:
变量名=变量值
自定义变量分为局部变量和全局变量。如果在定义变量时使用关键字export,就表示该变量为全局变量,针对所有Shell环境都生效;否则就是局部变量,只是针对当前的Shell环境生效,切换到其他Shell环境就失效了。对于变量的值,也就是变量的内容,可以使用单引号、双引号、反撇号,也可以不使用任何引号。
·不加任何引号:一般针对数字、简单的字符和字符串,如果内容中存在变量会解析出变量的值。
·单引号(‘’):变量的内容是什么就会原样输出什么,当引号中存在变量名时,也会将变量名当作普通字符处理。
·双引号(“”):和不加任何引号是一样的,但有些变量的内容必须加上双引号,比如逻辑运算符中的乘号“*”。编写脚本时一般直接省略。
·反撇号(``):表示变量的内容是由命令执行的结果而来的,在复制给变量时必须使用。反撇号是键盘Tab键上面的键输出的字符。

示例:
定义全局变量x和局部变量y
在这里插入图片描述

b.引用和打印变量值

引用变量值需要在变量名前面添加符号“$”,例如“$变量名”,如果引用的变量值输出时还需要在后面接其他字符,则必须使用“{}”将变量名包裹起来。
将引用的变量值打印输出到屏幕上,可以使用echo或printf命令,如“echo $变量名”或者“printf “$变量名””。在后面的学习中,echo命令的使用频率高一点。

示例:
引用变量a的值,并将结果输出到屏幕上,分别使用单引号和双引号进行测试
在这里插入图片描述
在引用变量name的值后面接上其他字符输出,如果变量名不使用“{}”包裹,则输出为空
在这里插入图片描述

c.查询和删除本地变量

可以使用set命令查询所有变量,包括本地变量,可以使用unset命令删除变量。

示例:
查看本地变量,会列出当前Shell环境中的所有变量
在这里插入图片描述
删除自定义的变量a,然后再打印输出变量的值就为空
在这里插入图片描述

d.从控制台给变量赋值

可以使用read命令通过控制台(键盘)对变量进行赋值,如果使用选项“-p”就必须接上描述语,就算描述语为空都行,否则变量定义失败。在实际编写脚本时最好接上对应的描述语,相当于添加了提示语。命令格式如下:
read 选项 变量名
常用选项说明如下:
·-a:将输入的数据复制给数组array,下标从0开始,@表示全部。
·-d:指定输入行的结束符号,默认使用换行符。
·-n:指定输入的字符数,如果没有指定字符数且没有全部读取完,按Enter键也会结束。
·-N:严格限定输入的字符数,如果没有指定字符数且没有全部读取完,按Enter键也不会结束。其中,换行符或回车符也算一个字符。
·-p:指定描述语。
·-s:静默显示,输入的内容不会在屏幕上显示。
·-t:设置超时时间,默认单位为秒(s)。

示例:
将读取的数据赋值给数组变量array
在这里插入图片描述
在这里插入图片描述
限制从控制台输入4个字符数,输入未满4个也可以按Enter键直接结束
在这里插入图片描述
严格限制从控制台输入6个字符,未满6个无法按Enter键结束,回车符也占用一个字符
在这里插入图片描述
按Enter键也算一个字符
在这里插入图片描述
定义变量c,从控制台给变量赋值,使用描述语,会显示一段提示告诉使用者干什么
在这里插入图片描述
不使用描述语,从控制台给变量d赋值
在这里插入图片描述
使用选项“-p”,但后面不接描述语,就会出现变量定义失败的情况
在这里插入图片描述

e.本地变量的运算符

在定义数字变量特别是整数时离不开各种运算符。例如,在后续介绍循环语句时需要控制脚本的循环次数,此时便需要使用一些简单的整数运算。下面介绍常用的运算符。
(1)算术运算符
Shell并不属于高级编程语言,因此只能进行一些简单的整数运算,对于小数等复杂的数据运算是不适用的。关于整数的算术运算符如表所示,其中需要重点掌握加减乘除的使用,其他的可以作为参考进行了解。
在这里插入图片描述
(2)比较运算符
对于整数或字符的比较无非就是相同或不同,使用的运算符如表所示。

在这里插入图片描述
(3)赋值运算符
表达式“a=a+1”有时候也会写成“a+=1”的格式,其中“+=”便是赋值运算符。常用的赋值运算符如表所示。
在这里插入图片描述

f.expr数值运算命令

expr命令属于Shell脚本中的标准语法,对于整数数值运算,其命令格式如下:
expr 数值[变量]
运算符 数值[变量]
注意,数值(或变量)与运算符之间需要使用空格隔开。

示例:
通过整数值运算
在这里插入图片描述
通过定义变量的方式运算
在这里插入图片描述

g.双小括号(())数值运算

并不是所有的运算符都可以使用expr命令实现,例如幂次方、位运算、比较运算和赋值运算等复杂的整数计算需要借助双小括号实现。

示例:
求3的二次方
在这里插入图片描述
a++表示先赋值后运算,++a表示先运算后赋值
在这里插入图片描述
按位取反,简单来说就是数字加1,得到的结果正数变复数,负数变正数
在这里插入图片描述
左移是以二进制数进行计算,3的二进制数为11,左移表示右侧补一位变成二进制数110,结果为十进制数6
在这里插入图片描述
右移,7的二进制数为111,去掉右侧两位变成二进制数1,转换为十进制为1
在这里插入图片描述
按二进制位进行异或运算,相同为0,不同为1,3的二进制数为011,5的二进制数为101,异或运算后二进制数为110,转换为十进制数为6
在这里插入图片描述
按二进制位进行或运算,只要有一个1就为1,3的二进制数为011,5的二进制数为101,或运算后二进制数为111,转换为十进制数为7
在这里插入图片描述
按二进制位进行与运算,全为1结果就是1,3的二进制数为011,5的二进制数为101,与运算后二进制数为001,转换为十进制数为1
在这里插入图片描述
对于变量的使用方式
在这里插入图片描述

h.$[]数值运算

$[]其实和$(())的用法一致,特别是在使用一些较为复杂的综合算术运算时推荐使用$[]。详细示例可以参考下面的示例,请注意查看显示结果。
注意:算术运算涉及的数字及变量都必须是整数,不能为小数。

示例:
比较运算符的使用,运算结果为真则返回1,为假则返回0
在这里插入图片描述

2)环境变量

环境变量也称为全局变量,就是用户登录系统后预先设定好的变量,命名规则是以大写字母、数字和其他字符组成,不使用小写字母。系统中默认的内置环境变量是无法修改的,只有极少数自定义的环境变量是可以进行修改的。
环境变量一般都存放在系统的配置文件中,而配置文件针对用户而言分为全局配置文件和局部配置文件。其中,全局配置文件是/etc/profile文件,其内设置的环境变量针对所有用户都生效;局部配置文件是位于用户宿主目录下的~/.bash_profile文件,其内设置的环境变量只针对该用户生效。

#查看环境变量
可以使用set命令查看所有环境变量,也可以使用专属查看环境变量的命令env和printenv。
在这里插入图片描述
在这里插入图片描述

#常用内置环境变量说明
系统中内置的环境变量都是系统已经设定好的,用户无法修改,部分自定义的环境变量是根据用户的设定变化的,下面对一些较为常用的内置环境变量进行说明。

·$USER和$LOGANME:当前登录的用户名。
·$UID:当前登录用户的UID号。
·$SHELL:当前登录用户的默认Shell环境。
·$HOME:当前登录用户的宿主目录。
·$PWD:当前用户的工作路径。
·$HOSTNAME:当前计算机的计算机名。
·$LANG:查看系统默认的字符编码。
·$PS1:当前用户的主提示符(命令行提示符)。
·$PS2:当前用户的辅助提示符。
·$REPLY:如果read命令中未指定变量名,这个环境变量默认作为read命令的变量名。

示例:
输出当前用户名:
在这里插入图片描述
查看系统默认的字符集编码:
在这里插入图片描述
查看当前用户的主提示符(命令行提示符):
在这里插入图片描述
查看当前用户的辅助提示符:
在这里插入图片描述
#自定义环境变量
除了内置的环境变量,有时候也会自定义一些软件或服务所需要的环境变量,一般都是直接存放到配置文件中。如果需要临时定义,则可以使用下面代码中的三种方式,其在系统重启之后就失效了。

3)位置变量

位置变量是给脚本中的变量传递参数使用的,使用$1~$9表示,如果数字超过了两位就使用大括号{}将数字引用起来,例如第十个位置变量表示为“${10}”。

示例:
编写脚本a.sh,使用位置变量:
在这里插入图片描述
在这里插入图片描述

4)特殊变量

特殊变量也称为预定义变量,用户是无法创建或修改特殊变量的。常用的特殊变量如下:
·$?:返回命令执行的状态,若要判断上条命令是否执行成功可以使用“echo $?”,返回的状态值为0表示执行成功,非0表示执行失败。
·$#:表示位置参数的个数。
·$*:表示位置参数的传递内容。
·$$:表示当前进程的进程ID号。
·$0:表示当前执行进程的进程名。
·$!:表示最后一个后台进程的进程ID号。

示例:
使用预定义变量$?判断上一条命令是否执行成功,0表示执行成功,非0表示执行失败:
在这里插入图片描述

修改上节中编写的脚本a.sh,添加预定义变量$#和$*,执行后查看效果:
在这里插入图片描述
显示当前进程的ID号和进程号:
在这里插入图片描述

二、认识Shell脚本

Shell脚本是一个以.sh结尾的可执行文件,执行语句的顺序是连续自动执行多条Linux命令,直到所有命令执行完毕后才会结束,用于完成系统中一些较为复杂的管理任务。

1、Shell脚本格式

Shell脚本的第一行是以“#!”开头,后面紧跟Shell环境的绝对路径以及Shell名,指明当前Shell脚本的运行环境,其中注释行也是以“#”开头。最核心的组成部分是可执行的语句块,语句块由多条Linux命令组成,也可以是流程控制语句。创建和编辑Shell脚本直接使用vi命令即可。

1)Shell脚本中常用的符号说明

在编写Shell脚本时会用到管道符、定向符以及特殊的文件。
#设备文件说明
·/dev/null:黑洞文件,一般在脚本中为不显示输出信息,可以将信息直接输入该文件中,但是文件大小是不会变化的。
·/dev/stdin:标准输入文件,有时候以设备编号0替代。
·/dev/stdout:标准输出文件,有时候以设备编号1替代。
·/dev/stderr:标准错误输出文件,有时候以设备编号2替代。

#管道符及定向符文件说明
·|:管道符,将前面命令的结果作为后面命令的参数使用。
·>:覆盖重定向标准的正确输出,将正确执行命令的结果直接写入指定文件,不在屏幕上显示,文件存在内容则直接覆盖。
·>>:追加重定向标准的正确输出,将正确执行命令的结果直接写入指定文件,不在屏幕上显示,文件存在内容则在文件尾部追加。
·2>:覆盖重定向标准的错误输出,和>相反,是将错误执行命令的结果写入文件中。
·2>>:追加重定向标准的错误输出,和>>相反,是将错误执行命令的结果写入文件中。
·&>:标准正确和错误输出,无论命令是否执行成功都会将结果写入文件中,不会在屏幕上显示。

示例:
将错误执行命令的结果写入/home/a.txt文件中,使用1>命令执行的结果会在屏幕上输出但不会写入文件,使用2>命令执行的结果直接写入文件,屏幕上没有输出
在这里插入图片描述
在脚本中最常用的一种,无论命令是否执行成功都不在终端上输出,标准输出和标准错误将结果写入文件 /dev/null中,其中、dev/null可理解为黑洞文件,输出再多数据文件也不会变化。这样也不会占用太多磁盘空间。
注意:1>&2表示把标准输出重定向到标准错误输出,2>&1表示把标准错误输出重定向到标准输出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值