Shell脚本【5】Shell 内置命令(alias、echo、read、exit、declare)

内置命令

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"
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章