赞
踩
在学习Shell脚本之前,首先需要明白Shell脚本到底是什么。Shell脚本简单来说就是一个命令解释器,它是介于操作系统内核与用户之间,负责将用户输入的命令传递给系统内核进行执行,然后将结果输出到终端上给用户。其作用相当于一个“翻译官”。Shell脚本是偏向于操作系统层面的脚本编程语言,相对于其他高级编程语言,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的替代品。
以ubunut系统为例讲解如何查询该系统支持的Shell环境。
在使用系统的过程中,如果用户需要使用不同的Shell环境去操作命令,可以通过临时切换和永久修改两种方式实现。永久修改方式需要重启之后才能生效。
临时切换用户的Shell环境只是临时调用,重启之后就失效了,可以通过/etc/shells文件查询系统支持的Shell环境,在Linux中直接使用Shell名或者绝对路径。
将当前用户的Shell环境从bin/bash切换成/bin/sh,使用Shell名或者绝对路径:
使用exit命令返回原来的Shell环境:
如果要将用户的Shell环境永久修改,可以通过usermod和chsh两条命令来实现,其中Shell名一定要使用绝对路径加名称(可以通过查询/etc/shells文件获取)。注意,需要重启用户之后用户下次登录时才会生效。命令格式如下:
usermod -s Shell名 用户名
usermod -s Shell名 用户名
使用usermod命令修改zxw用户的Shell环境为/bin/sh:
使用chsh命令修改zxw用户的Shell环境为/bin/sh:
在编写Shell脚本时需要用到Shell变量。变量通常使用特定的字符(一般是以下划线或字母开头)表示,它用来存储数据,只不过这些数据是随着系统或用户设定的变化而变化的。变量的赋值采用表达式的方式,即“变量名=变量值”,其中等于号“=”表示赋值,意思是将右边的变量赋值给左边的变量名。
在Shell脚本中变量主要分为4类,即本地变量、环境变量、位置变量和特殊变量。
在介绍Shell变量之前,首先熟悉下几条命令的使用方式
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命令的特定在于能够控制输出的格式,因此在编写Shell脚本时,某些场景也会使用printf命令。命令格式如下:
printf 格式 字符串[特殊符号]
printf命令的常用类型转换符说明如下:
示例:
#使用转义符
\n:换行。
#类型转换符
使用%d、%.2f、%o和%x将参数12分别转换为十进制数、带两位小数的浮点数、八进制数和十六进制数、结合转义符“\n”实现换行输出
言归正传,我们来了解下Shell脚本的四种变量。
本地变量就是用户自己定义的变量,也称为自定义变量,只在当前用户的Shell环境中生效。如果在Shell中启动另外一个进程或者退出一个进程,这个变量就失效了。
变量名一般以下划线或字母开头,名称由字母、数字和下划线组合而成,通过表达式的形式定义,格式如下:
变量名=变量值
自定义变量分为局部变量和全局变量。如果在定义变量时使用关键字export,就表示该变量为全局变量,针对所有Shell环境都生效;否则就是局部变量,只是针对当前的Shell环境生效,切换到其他Shell环境就失效了。对于变量的值,也就是变量的内容,可以使用单引号、双引号、反撇号,也可以不使用任何引号。
·不加任何引号:一般针对数字、简单的字符和字符串,如果内容中存在变量会解析出变量的值。
·单引号(‘’):变量的内容是什么就会原样输出什么,当引号中存在变量名时,也会将变量名当作普通字符处理。
·双引号(“”):和不加任何引号是一样的,但有些变量的内容必须加上双引号,比如逻辑运算符中的乘号“*”。编写脚本时一般直接省略。
·反撇号(``):表示变量的内容是由命令执行的结果而来的,在复制给变量时必须使用。反撇号是键盘Tab键上面的键输出的字符。
示例:
定义全局变量x和局部变量y
引用变量值需要在变量名前面添加符号“$”,例如“$变量名”,如果引用的变量值输出时还需要在后面接其他字符,则必须使用“{}”将变量名包裹起来。
将引用的变量值打印输出到屏幕上,可以使用echo或printf命令,如“echo $变量名”或者“printf “$变量名””。在后面的学习中,echo命令的使用频率高一点。
示例:
引用变量a的值,并将结果输出到屏幕上,分别使用单引号和双引号进行测试
在引用变量name的值后面接上其他字符输出,如果变量名不使用“{}”包裹,则输出为空
可以使用set命令查询所有变量,包括本地变量,可以使用unset命令删除变量。
示例:
查看本地变量,会列出当前Shell环境中的所有变量
删除自定义的变量a,然后再打印输出变量的值就为空
可以使用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”,但后面不接描述语,就会出现变量定义失败的情况
在定义数字变量特别是整数时离不开各种运算符。例如,在后续介绍循环语句时需要控制脚本的循环次数,此时便需要使用一些简单的整数运算。下面介绍常用的运算符。
(1)算术运算符
Shell并不属于高级编程语言,因此只能进行一些简单的整数运算,对于小数等复杂的数据运算是不适用的。关于整数的算术运算符如表所示,其中需要重点掌握加减乘除的使用,其他的可以作为参考进行了解。
(2)比较运算符
对于整数或字符的比较无非就是相同或不同,使用的运算符如表所示。
(3)赋值运算符
表达式“a=a+1”有时候也会写成“a+=1”的格式,其中“+=”便是赋值运算符。常用的赋值运算符如表所示。
expr命令属于Shell脚本中的标准语法,对于整数数值运算,其命令格式如下:
expr 数值[变量]
运算符 数值[变量]
注意,数值(或变量)与运算符之间需要使用空格隔开。
示例:
通过整数值运算
通过定义变量的方式运算
并不是所有的运算符都可以使用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
对于变量的使用方式
$[]其实和$(())的用法一致,特别是在使用一些较为复杂的综合算术运算时推荐使用$[]。详细示例可以参考下面的示例,请注意查看显示结果。
注意:算术运算涉及的数字及变量都必须是整数,不能为小数。
示例:
比较运算符的使用,运算结果为真则返回1,为假则返回0
环境变量也称为全局变量,就是用户登录系统后预先设定好的变量,命名规则是以大写字母、数字和其他字符组成,不使用小写字母。系统中默认的内置环境变量是无法修改的,只有极少数自定义的环境变量是可以进行修改的。
环境变量一般都存放在系统的配置文件中,而配置文件针对用户而言分为全局配置文件和局部配置文件。其中,全局配置文件是/etc/profile文件,其内设置的环境变量针对所有用户都生效;局部配置文件是位于用户宿主目录下的~/.bash_profile文件,其内设置的环境变量只针对该用户生效。
#查看环境变量
可以使用set命令查看所有环境变量,也可以使用专属查看环境变量的命令env和printenv。
#常用内置环境变量说明
系统中内置的环境变量都是系统已经设定好的,用户无法修改,部分自定义的环境变量是根据用户的设定变化的,下面对一些较为常用的内置环境变量进行说明。
·$USER和$LOGANME:当前登录的用户名。
·$UID:当前登录用户的UID号。
·$SHELL:当前登录用户的默认Shell环境。
·$HOME:当前登录用户的宿主目录。
·$PWD:当前用户的工作路径。
·$HOSTNAME:当前计算机的计算机名。
·$LANG:查看系统默认的字符编码。
·$PS1:当前用户的主提示符(命令行提示符)。
·$PS2:当前用户的辅助提示符。
·$REPLY:如果read命令中未指定变量名
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。