Shell内置命令
理解内置命令的含义。
内置命令介绍
Shell内置命令,就是由Bash Shell自身提供的命令,而不是文件系统中的可执行文件。
使用type 可以用来确定一个命令是否是内置命令:
type 命令
演示:
对于上述演示的两个命令来说,cd就是内嵌的Shell命令,而ifconfig就是一个可执行文件。
通常来说,内置命令会比外部命令执行得更快,执行外部命令时不但会触发磁盘I/O,还需要fork 出一个单独的进程来执行,执行完成后再退出。而执行内置命令相当于调用当前Shell进程的一个函数,还是在当前Shell环境进程内,减少了上下文切换。
常用的内置命令
alias介绍
alias用于给命令创建别名。
好处:可以将经常操作比较复杂的命令进行设置别名,通过别名的操作提高工作效率。
若该命令不带任何参数,则显示当前Shell进程中的所有别名列表。
上面的是系统为了方便命令操作系统默认将部分命令创建为别名ll 的命令与 ls -l 的效果一样,就是因为ll 是别名。
alias别名定义语法
alias 别名="命令"
这里使用单引号或者双引号都可以。
演示:
unalias别名删除语法
删除指定的别名:
unalias 别名
删除当前Shell环境中所有的别名:
unalias -a
演示是比较简单的,这里不再赘述。
注意:以上两种方式删除都是临时删除当前Shell的别名,如果想永久删除必须去配置文件中手动删除。
echo介绍
echo是一个Shell内置命令,用于在终端输出字符串,并在最后默认加上换行符。
echo输出语法
默认输出换行语法:
echo 字符串
输出不换行语法:
echo -n 字符串
演示:
编写一个脚本文件:
运行结果如下:
echo输出转义字符
比如 \n,用于echo输出字符串非结尾处的换行,但是默认echo无法解析\n转义字符。
这个时候可以使用 -e 参数,该参数用于解析转义字符:
echo -e "字符串中含有转义字符"
常用的转义字符除了上面的\n换行符之外,还有\c用来清除echo结尾的换行。
read介绍
read是Shell内置命令,用于从标准输入中读取数据并赋值给变量。如果没有进行从重定向,默认就是从终端控制台读取用户输入的数据;如果进行了重定向,那么可以从文件中读取数据。
后续会讲解Shell重定向。
语法
read [-options] [var1 var2 ...]
options表示选项,如下表所示;var表示用来存储数据的变量,可以有一个,也可以有多个。
options和var都是可选的,如果没有提供变量名,那么读取的数据将存放到环境变量 REPLY 变量中。
$REPLY 保存read最后一个读入命令的数据。
演示一下:
options支持的参数:
需求示例
1、使用read命令给多个变量赋值:
运行效果如下:
2、从终端控制台只读取一个字符:
运行效果如下,注意这里要用bash命令执行,使用sh命令会报-n参数非法的错误,我也不知道为什么:
3、在终端控制台输入时,设置指定时间内输入密码:
运行效果如下:
exit介绍
exit用于退出当前Shell环境进程结束运行,并且可以返回一个状态码。一般使用 $? 可以获取退出状态码。
语法
正确退出语法:
exit # 默认返回状态码0,一般代表命令执行成功
错误退出语法
exit 非0数字 # 数字建议的范围0到255,一般代表命令执行失败
应用场景
1、结束当前Shell进程
2、当Shell进程执行出错退出时,可以返回不同的状态值代表不同的错误
比如打开一个文件时,可以返回1 表示文件不存在,2 表示文件没有读取权限,3 表示文件类型不对。
需求示例
编写Shell脚本使用exit退出,退出时返回一个非0数字状态值,执行脚本文件并打印返回状态值。
执行效果如下:
declare介绍
declare命令用于声明Shell变量。可用来声明变量并设置变量的属性,也可用来显示Shell函数。若不加上任何参数,则会显示全部的Shell变量与函数(与执行set指令的效果相同)。
declare命令作用
1、设置变量的属性[重要]
2、查看全部Shell变量与函数
3、实现关联数组变量[重要]
declare设置变量的属性语法
declare [+/-] [aArxif] [变量名称=设置值]
需求示例
操作一个变量属性,设置为整形\取消整形\设置为只读等操作:
查看全部Shell变量与函数
declare -f 查询所有函数的定义
declare -F 查询所有函数的名称列表
关于函数后面还会说,这里先了解一下即可。
实现key-value关联数组变量语法
关联数组也称为"键值对(key-value)"数组,键(key)也即字符串形式的数组下标,值(value)也即元素值。
语法如下:
declare -A 关联数组变量名=([字符串key1]=值1 [字符串key2]=值2 ...)
declare 也可以用于定义普通索引数组,-a 参数创建普通或索引数组,-A 创建关联数组。
declare -a 索引数组变量名=(值1 值2 …)
declare -a 索引数组变量名=([0]=值1 [1]=值2 …)
获取指定key的值:
${关联数组变量名[key]}
获取所有值:
${关联数组变量名[*]} # 方式1
${关联数组变量名[@]} # 方式2
演示如下:
运行效果如下:
注意:之前学习的创建普通索引数组的方式也可以用来创建这种关联数组,但是获取值的时候是错误的,因此要创建关联数组只能使用declare!
Shell运算符
掌握算数运算符的使用。
掌握expr求值表达式命令。
expr 介绍
expr 是evaluate expressions的缩写,译为“求值表达式”。Shell expr是一个功能强大,并且比较复杂的命令,它除了可以实现整数计算,还可以结合一些选项对字符串进行处理,例如计算字符串长度、字符串比较、字符串匹配、字符串提取等,后续讲解。
expr 语法
计算语法:
expr 算数运算符表达式
注意:运算表达式
获取计算结果赋值给新变量语法:
result=`expr 算数运算符表达式`
注意:上面用的是反引号不是单引号嗷。
演示:
注意:运算符表达式中每个数字与符号之间要有空格。
算数运算符介绍
下表列出了常用的算数运算符,假定变量 a 为 1,变量 b 为 2:
演示:
运行结果如下:
Shell运算符:比较运算符
了解有哪些比较运算符。
掌握推荐使用哪个比较运算符。
整数比较运算符
下表列出了常用的比较运算符,假定变量 a 为 1 ,变量 b 为 2:
以其中几个为例简单演示一下:
注意:
整数比较运算符只支持整数,不支持小数与字符串(字符串比较后续讲解),除非字符串的值是整数数字。
每个命令都有返回值,这个后面我们会讲解退出状态时再具体说明,返回0代表成功,返回1代表失败。
Shell运算符:字符串比较运算符
可以比较2个变量,变量的类型可以为数字(整数,小数)与字符串。
语法
下表列出了常用的字符串运算符,假定变量 a 为 “abc”,变量 b 为"efg":
字符串比较可以使用 [[]] 和 [] 两种方式。
运算符 : 说明 : 举例
纠正一下:上图中的 $ 运算符是检测字符串是否不为空,不为空返回 0 为空返回 1 。
注意:字符串比较没有 <= ,但可以通过 [[ “a” < “b” || “a” = “b” ]] 来实现。
依然是以其中几个为例演示:
注意:对于双方括号来说其内的特殊符号不需要进行转义,而单括号则需要。
[[]] 和 [] 的区别
区别1:word splitting 单词分隔
[ [ ] ] 不会有 word splitting 发生。
[ ] 会有 word splitting 发生。
word splitting 介绍
会将含有空格字符串进行分拆分割后比较。
演示:
区别2:转义字符
[ [ ] ] 对 < 不需要转义,格式为 [[ 字符串1 < 字符串2 ]]
[ ] 需要对 <,> 转义,格式为 [ 字符串1 < 字符串2 ]
演示之前已经提过,这里不再赘述。
结论
更推荐使用双方括号来进行字符串比较运算。
Shell运算符:布尔运算符
介绍
注意这里我们暂时还会用单方括号,但是后面就不会再用了,因为有test命令的存在。
演示:
Shell运算符:逻辑运算符
要理解逻辑运算符与布尔运算符区别。
逻辑运算符介绍:
演示如下:
Shell运算符:文件测试运算符
能够使用常用文件测试运算符检查文件。
如:文件是否存在、是否可读、是否可执行、是否为空、是否可写、是否是目录、是否是普通文件等。
Linux系统文件系统介绍
-:普通文件
d:目录文件
l:链接文件
b:块设备文件
c:字符设备文件
p:管道文件
演示:
块设备文件,比如在目录/dev下面的计算机硬盘文件:
设备文件都是对应计算机硬件的,不同的设备文件代表不同的传输数据方式。
文件测试运算符介绍
文件测试运算符用于检测文件的各种属性。
属性检测描述如下:
命令虽然有很多,但常用的比较重点的就黄色部分标出来的。
其他检查符:
-S: 判断某文件是否 socket。
-L: link, 检测文件是否存在并且是一个符号链接。
语法如下:
[ options 文件路径字符串 ]
或
[[ options 文件路径字符串 ]]
演示:
运行结果如下:
测试这个代码的时候要注意,文件的路径一定要写绝对路径嗷(也就是从文件根目录 / 的位置开始写),否则所有的判断都会走else,我就踩了这个坑…