Shell内置命令

Shell内置命令

Shell 命令分为外部命令和内置命令:

比较 内置命令 外部命名
定义 Bash Shell 自带的命令 Linux 系统中的应用程序
执行效率
执行过程 调用当前 Shell 进程的一个函数 触发磁盘 I/O,fork 出一个单独的进程,执行完成后退出

内建命令

定义

内建命令是由 Bash 自身提供的命令,而不是文件系统中的某个可执行文件

鉴别方式

使用 type 来确定一个命令是否是内建命令

type cd
cd is a Shell builtin
type ifconfig
ifconfig is /sbin/ifconfig

从返回结果来看,cd是一个内建命令,ifconfig是一个外部文件

內建命令及说明

命令 说明
: 扩展参数列表,执行重定向操作
. 读取并执行指定文件中的命令(在当前 shell 环境中)
alias 为指定命令定义一个别名
bg 将作业以后台模式运行
bind 将键盘序列绑定到一个 readline 函数或宏
break 退出 for、while、select 或 until 循环
builtin 执行指定的 shell 内建命令
caller 返回活动子函数调用的上下文
cd 将当前目录切换为指定的目录
command 执行指定的命令,无需进行通常的 shell 查找
compgen 为指定单词生成可能的补全匹配
complete 显示指定的单词是如何补全的
compopt 修改指定单词的补全选项
continue 继续执行 for、while、select 或 until 循环的下一次迭代
declare 声明一个变量或变量类型。
dirs 显示当前存储目录的列表
disown 从进程作业表中刪除指定的作业
echo 将指定字符串输出到 STDOUT
enable 启用或禁用指定的内建shell命令
eval 将指定的参数拼接成一个命令,然后执行该命令
exec 用指定命令替换 shell 进程
exit 强制 shell 以指定的退出状态码退出
export 设置子 shell 进程可用的变量
fc 从历史记录中选择命令列表
fg 将作业以前台模式运行
getopts 分析指定的位置参数
hash 查找并记住指定命令的全路径名
help 显示帮助文件
history 显示命令历史记录
jobs 列出活动作业
kill 向指定的进程 ID(PID) 发送一个系统信号
let 计算一个数学表达式中的每个参数
local 在函数中创建一个作用域受限的变量
logout 退出登录 shell
mapfile 从 STDIN 读取数据行,并将其加入索引数组
popd 从目录栈中删除记录
printf 使用格式化字符串显示文本
pushd 向目录栈添加一个目录
pwd 显示当前工作目录的路径名
read 从 STDIN 读取一行数据并将其赋给一个变量
readarray 从 STDIN 读取数据行并将其放入索引数组
readonly 从 STDIN 读取一行数据并将其赋给一个不可修改的变量
return 强制函数以某个值退出,这个值可以被调用脚本提取
set 设置并显示环境变量的值和 shell 属性
shift 将位置参数依次向下降一个位置
shopt 打开/关闭控制 shell 可选行为的变量值
source 读取并执行指定文件中的命令(在当前 shell 环境中)
suspend 暂停 Shell 的执行,直到收到一个 SIGCONT 信号
test 基于指定条件返回退出状态码 0 或 1
times 显示累计的用户和系统时间
trap 如果收到了指定的系统信号,执行指定的命令
type 显示指定的单词如果作为命令将会如何被解释
typeset 声明一个变量或变量类型。
ulimit 为系统用户设置指定的资源的上限
umask 为新建的文件和目录设置默认权限
unalias 刪除指定的别名
unset 刪除指定的环境变量或 shell 属性
wait 等待指定的进程完成,并返回退出状态码

alias 给命令创建别名

alias 用来给命令创建一个别名。若直接输入该命令且不带任何参数,则列出当前Shell进程中使用了哪些别名。

Shell内置命令_第1张图片

使用alias自定义别名

#!/bin/bash
alias timestamp='date +%s'
#alias
begin=`timestamp`
sleep 10s
finish=$(timestamp)
difference=$((finish - begin))
echo "run time:${difference} s"

在执行该脚本时,需要使用source或者.关键字使其在当前shell环境中执行脚本,详见shell脚本简介中运行Shell的四种方法

还有就是Shell变量中的命令替换的使用,之前是直接使用的date + %s,现在使用了alias就可以简化代码

改别名创建后只是暂时的,而且只能在当前环境下访问的到,在子进程和其他进程中均不可使用。

使用unalias删除别名

使用 unalias 内建命令可以删除当前 Shell 进程中的别名。

使用方法

  • 第一种用法是在命令后跟上某个命令的别名,用于删除指定的别名。
  • 第二种用法是在命令后接-a参数,删除当前 Shell 进程中所有的别名。

这两种方法都是在当前 Shell 进程中生效的。要想永久删除配置文件中定义的别名,只能进入该文件手动删除。

Shell内置命令_第2张图片

echo 输出字符串

在前边我门已经用了很多次echo输出了,在这里进行一下系统的总结。

不换行

echo 命令输出结束后默认会换行,如果不希望换行,可以加上-n参数

输出转义字符

默认情况下,echo 不会解析以反斜杠\开头的转义字符。比如,\n表示换行,echo 默认会将它作为普通字符对待。我们可以添加-e参数来让 echo 命令解析转义字符。

#!/bin/bash
echo "hello \nworld"
echo -e "hello \nworld"

输出如下

hello \nworld
hello 
world

read 读取从键盘输入的数据

read是内置命令,用来从标准输入中读取数据并赋值给变量。如果没有进行重定向,默认就是从键盘读取用户输入的数据;如果进行了重定向,那么可以从文件中读取数据。

格式

read [-options] [variables]

options表示选项,如下表所示;variables表示用来存储数据的变量,可以有一个,也可以有多个。

optionsvariables都是可选的,如果没有提供变量名,那么读取的数据将存放到环境变量 REPLY 中。

options选项及说明

选项 说明
-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
read -p "请分别输入名字、性别和年龄:" name sex age
echo "名字:$name"
echo "性别:$sex"
echo "年龄:$age"

read -n 1 -p "输入一个字符:" char && printf "\n"
echo $char

if
    read -t 20 -sp "请在20s内输入密码:" pass1 && printf "\n"
    read -t 20 -sp "请再次在20s内输入密码:" pass2 && printf "\n"
    [ $pass1 == $pass2 ]
then
    echo "输入正确"
else
    echo "输入错误"
fi

执行结果

Shell内置命令_第3张图片

exit 退出当前进程

exit用来退出当前进程,并返回一个退出状态。使用$?可以接收这个状态。

exit还可以指定一个整数值作为退出状态,若不指定,则为0。一般退出状态为0表示成功,非0表示失败。

示例

#!/bin/bash

echo "exit 执行前"
exit 5
echo "exit 执行后"

执行完成后,输出结果只有执行exit之前的输出,在执行exit之后直接就结束了

然后使用$?在界面获取退出状态,状态为5

declare 设置变量属性

declare 和 typeset用法相同,都用来设置变量的属性。不过typeset已经被弃用了,由declare代替。

格式

declare [+/-] [aAfFgilprtux] [变量名=变量值]

-表示设置属性,+表示取消属性,aAfFgilprtux都是具体的选项

选项 含义
-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 -i m n
m=10
n=15
echo $((m - n))

#设置只读变量
declare -r n=20
n=25
echo $n

#显示m和n的和值
declare -p m n

执行结果

-5
./declare.sh: 行 11: n: 只读变量
20
declare -i m="10"
declare -ir n="20"

你可能感兴趣的:(linux,shell,shell脚本,linux内置命令,內建命令)