Shell 内建命令
内置命令
Shell 内置命令,就是由 Bash 自身提供的命令,而不是文件系统中的某个可执行文件。
pwd 是一个 Shell 内置命令,该命令并不是某个外部文件,只要在 Shell 中就一定可以运行这个命令。而 ip 是一个外部文件,它的位置是/usr/sbin/ip
[root@system ~]# type pwd
pwd is a shell builtin
[root@system ~]# type ip
ip is /usr/sbin/ip
系统变量 $PATH 包含的目录中几乎聚集了系统中绝大多数的可执行命令,它们都是外部命令。
[root@system1 ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
通常来说,内置命令会比外部命令执行得更快,执行外部命令时不但会触发磁盘 I/O,还需要 fork 出一个单独的进程来执行,执行完成后再退出。而执行内置命令相当于调用当前 Shell 进程的一个函数。
常用的Bash Shell 内置命令
命令 | 说明 |
---|---|
. | 读取并执行指定文件中的命令(在当前 shell 环境中) |
alias | 为指定命令定义一个别名 |
bg | 将作业以后台模式运行 |
fg | 将作业以前台模式运行 |
break | 退出 for、while、select 或 until 循环 |
declare | 声明一个变量或变量类型。 |
cd | 将当前目录切换为指定的目录 |
command | 执行指定的命令,无需进行通常的 shell 查找 |
continue | 继续执行 for、while、select 或 until 循环的下一次迭代 |
echo | 将指定字符串输出到 STDOUT |
enable | 启用或禁用指定的内建shell命令 |
exec | 用指定命令替换 shell 进程 |
exit | 强制 shell 以指定的退出状态码退出 |
export | 设置子 shell 进程可用的变量 |
help | 显示帮助文件 |
history | 显示命令历史记录 |
jobs | 列出活动作业 |
kill | 向指定的进程 ID(PID) 发送一个系统信号 |
printf | 使用格式化字符串显示文本 |
pwd | 显示当前工作目录的路径名 |
read | 从 STDIN 读取一行数据并将其赋给一个变量 |
readonly | 从 STDIN 读取一行数据并将其赋给一个不可修改的变量 |
return | 强制函数以某个值退出,这个值可以被调用脚本提取 |
set | 设置并显示环境变量的值和 shell 属性 |
source | 读取并执行指定文件中的命令(在当前 shell 环境中) |
times | 显示累计的用户和系统时间 |
type | 显示指定的单词如果作为命令将会如何被解释 |
typeset | 声明一个变量或变量类型。 |
umask | 为新建的文件和目录设置默认权限 |
unalias | 删除指定的别名 |
unset | 删除指定的环境变量或 shell 属性 |
wait | 等待指定的进程完成,并返回退出状态码 |
alias命令:自定义别名
alisa 用来给命令创建一个别名。若直接输入该命令且不带任何参数,则列出当前 Shell 进程中使用了哪些别名。如:ll就是ls -l的命令别名
定义格式:
alias 别名='命令'
示例:
定义cd /etc命令别名haha
[root@system ~]# alias haha='cd /etc'
[root@system ~]# haha
[root@system etc]#
定义date命令的别名xixi
[root@system1 ~]# alias xixi='date'
[root@system1 ~]# xixi
Sun May 31 22:45:02 CST 2020
在代码中使用 alias 命令定义的别名只能在当前 Shell 进程中使用,在子进程和其它进程中都不能使用。当前 Shell 进程结束后,别名也随之消失。
要想让别名对所有的 Shell 进程都有效,就得把别名写入 Shell 配置文件。可以把别名命令写入到/etc/bashrc文件中,/etc/bashrc文件为每一个运行bash shell 的用户均执行此文件.当bash shell被打开时,该文件被读取.
unalias命令:删除别名
使用 unalias 内建命令可以删除当前 Shell 进程中的别名。unalias 有两种使用方法:
- 第一种用法是在命令后跟上某个命令的别名,用于删除指定的别名。
- 第二种用法是在命令后接-a参数,删除当前 Shell 进程中所有的别名。
这两种方法都是在当前 Shell 进程中生效的。要想永久删除配置文件中定义的别名,只能进入该文件手动删除
[root@system1 ~]# unalias ll #删除ll别名
[root@system1 ~]# ll
bash: ll: command not found... #运行命令时找不到了
[root@system1 ~]# ls -l
total 52
echo 命令:终端输出字符串
echo 是一个 Shell 内建命令,用来在终端输出字符串,并在最后默认加上换行符。
可用选项
-n 不在最后自动换行
-e 启用反斜线控制字符的转换
-E 不处理转义字符,默认选项
转义符
\a 从系统喇叭发送声音
\b 向左删除
\c 取消行末的换行符号
\E ESCAPE键
\f 换页字符
\n 换行字符
\r 回车键
\t 制表符
\v 垂直制表符
\\ 反斜线本身
示例:
[root@system ~]# echo -e "a\tb\tc\nd\te\tf"
a b c
d e f
- 反引号实现命令
- 替换在单引号中的所有字符(包括元字符),保留原有字符含义
- 在一对双引号中的字符(包括元字符),除了$、反引号和反斜线外,其他均保留原字符的含义
[root@rhel8 ~]# dlist='whoami'
[root@rhel8 ~]# echo "* $dlist end"
* whoami end
[root@rhel8 ~]# echo "`$dlist`"
root
[root@rhel8 ~]# echo "\$dlist"
$dlist
read命令:读取从键盘输入的数据
read 是 Shell 内置命令,用来从标准输入中读取数据并赋值给变量。如果没有进行重定向,默认就是从键盘读取用户输入的数据;如果进行了重定向,那么可以从文件中读取数据。
read 命令的用法为:
read [-options] [variables]
options表示选项;variables表示用来存储数据的变量,可以有一个,也可以有多个。
Shell read 命令支持的选项
选项 | 说明 |
---|---|
-a array | 把读取的数据赋值给数组 array,从下标 0 开始。 |
-d delimiter | 用字符串 delimiter 指定读取结束的位置,而不是一个换行符(读取到的数据不包括 delimiter)。 |
-e | 在获取用户输入的时候,对功能键进行编码转换,不会直接显式功能键对应的字符。 |
-n num | 读取 num 个字符,而不是整行字符。 |
-p prompt | 显示提示信息,提示内容为 prompt。 |
-r | 原样读取(Raw mode),不把反斜杠字符解释为转义字符。 |
-s | 静默模式(Silent mode),不会在屏幕上显示输入的字符。当输入密码和其它确认信息的时候,这是很有必要的。 |
-t seconds | 设置超时时间,单位为秒。如果用户没有在指定时间内输入完成,那么 read 将会返回一个非 0 的退出状态,表示读取失败。 |
-u fd | 使用文件描述符 fd 作为输入源,而不是标准输入,类似于重定向。 |
示例:在指定时间内输入密码。
#!/bin/bash
if
read -t 10 -sp "Enter password 1>" pass1 && printf "\n" &&
read -t 10 -sp "Enter password 2>" pass2 && printf "\n" &&
[ $pass1 == $pass2 ]
then
echo "Valid passowrd"
else
echo "Invalid password"
fi
如果两次输入密码相同,运行结果为:
Enter password 1>
Enter password 2>
Valid password
如果两次输入密码不同,运行结果为:
Enter password 1>
Enter password 2>
Invalid password
如果第一次输入超时,运行结果为:
Enter password 1 > Invalid password
如果第二次输入超时,运行结果为:
Enter password 1>
Enter password 2> Invalid password
exit命令:退出当前进程
exit 是一个 Shell 内置命令,用来退出当前 Shell 进程,并返回一个退出状态;使用$?可以接收这个退出状态
exit 命令可以接受一个整数值作为参数,代表退出状态。如果不指定,默认状态值是 0。一般情况下,退出状态为 0 表示成功,退出状态为非 0 表示执行失败(出错)了
示例:
#!/bin/bash
echo "befor exit"
exit 2
echo "after exit"
运行结果:
befor exit
exit 命令后,脚本执行就结束了,所以不会输出after exit
declare命令:设置变量属性
declare 命令的用法:
declare [+/-] [选项] [变量名=变量值]
其中,-表示设置属性,+表示取消属性
declare 命令选项有:
选项 | 含义 |
---|---|
-f [name] | 列出之前由用户在脚本中定义的函数名称和函数体。 |
-F [name] | 仅列出自定义函数名称。 |
-g name | 在 Shell 函数内部创建全局变量。 |
-p [name] | 显示指定变量的属性和值。 |
-a name | 声明变量为普通数组。 |
-A name | 声明变量为关联数组(支持索引下标为字符串)。 |
-i name | 将变量定义为整数型。 |
-r name[=value] | 将变量定义为只读(不可修改和删除),等价于 readonly name。 |
-x name[=value] | 将变量设置为环境变量,等价于 export name[=value]。 |
示例:
#!/bin/bash
declare -r n=10 #设置只读变量
declare -i a b c #将多个变量声明为整数
a=1
b=2
c=$a+$b
echo $c
运行结果:3
显示变量的属性和值。
[root@system ~]# declare -r m=10
[root@system ~]# declare -p m
declare -r m="10"