1.内置命令介绍

Shell 内置命令,就是由 Bash Shell 自身提供的命令,而不是文件系统中的可执行文件。

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

type 命令

通常来说,内置命令会比外部命令(脚本文件)执行得更快,执行外部命令时不但会触发磁盘 I/O,还需要 fork 出一个单独的进程来执行,执行完成后再退出。而执行内置命令相当于调用当前 Shell 进程的一个函数, 还是一个进程, 减少了上下文切换,速度比较快。

1.1 内置命令列表

命令 说明
: 扩展参数列表,执行重定向操作
. 读取并执行指定文件中的命令(在当前 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 等待指定的进程完成,并返回退出状态码

2.alias内置命令

alisa 用于给命令创建别名。若该命令且不带任何参数,则显示当前 Shell 进程中的所有别名列表。

  • alias - 显示当前环境中的别名列表

2.1 alias别名定义语法

alias 别名='命令'
# 查看所有进程
ps -aux alias psList = "ps -aux"

2.2 unalias 别名删除语法

删除指定的别名

unalias 别名

删除当前Shell环境中所有的别名

unalias -a

注意: 以上2种方式删除都是临时删除当前Shell的别名, 如果想永久删除必须去配置文件中手动删除

别名持久化,alias命令的作用只是暂时的。一旦关闭当前终端,所有设置过的别名就失效了。为了使别名设置一直保持作用,可以将它放入~/.bashrc文件中。因为每当一个新的shell进程生成时,都会执行 ~/.bashrc中的命令。

3.echo内置命令

echo 是一个 Shell 内置命令,用于在终端输出字符串,并在最后默认加上换行符

3.1 echo输出语法

默认输出换行语法

echo 字符串

输出不换行语法

echo -n  字符串

3.2 输出演示

# 1.创建echo1.sh
touch echo1.sh # 2.编辑文件
#!/bin/bash
echo "hello"
echo "world"
echo -n "Icer"
echo -n "Newer"

3.3 echo输出转义字符

默认是不能解析字符串中的转义字符的,如果想要解析换行符需要使用-e

echo -e "含有转义字符的字符串"
# 换行输出
echo -e "hello \nworld" # 清除echo结尾的换行符
echo -e "hello world\c"

4.read内置命令

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

后续Shell重定向讲解

4.1 语法

read [-options] [var1 var2 ...]

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

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

$REPLY保存read最后一个读入命令的数据

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 作为输入源,而不是标准输入,类似于重定向。

4.2 read使用实例

# 接收多个变量值并打印

#!/bin/bash
read -p "please input name age hobby" name age hobby
echo "${name}"
echo "${age}"
echo "${hobby}"
# 控制终端只读取一个字符,打印输出这个字符
#!/bin/bash
read -p " Are you sure you want to delete the data?(y/n)" -n 1 char # printf "" 可以直接进行输出
printf "\n" echo "${char}"
# 限制时间的输入
#!/bin/bash
read -sp "please input password:" -t 20s password1 printf "\n" read -sp "please input password again:" -t 20s password2 if [$password1 == $password2]
then
echo "pass"
else
echo "password error"
fi

5.exit退出

exit 用于退出当前Shell环境进程结束运行, 并且可以返回一个状态码.一般使用 $? 可以获取退出状态码

正确退出语法

exit  # 默认返回状态码0, 一般代表命令执行成功

错误退出语法

exit 非0数字 # 数字建议的范围0~255,  一般代表命令执行失败

5.1 exit使用场景

1.结束当前Shell进程

2.当Shell 进程执行出错退出时,可以返回不同的状态值代表不同的错误

比如执行一个脚本文件里面操作一个文件时,可以返回1 表示文件不存在,2 表示文件没有读取权限,3 表示文件类型不对。

5.2 exit使用实例

编写Shell脚本使用exit 退出, 退出时返回一个非0数字状态值, 执行脚本文件并打印返回状态值

#!/bin/bash

echo "hello"
exit 2
echo "world"

6.declare设置变量

declare命令用于声明 shell 变量。可用来声明变量并设置变量的属性,也可用来显示shell函数。若不加上任何参数,则会显示全部的shell变量与函数(与执行set指令的效果相同)。

6.1 declare设置变量的语法

declare [+/-][aArxif][变量名称=设置值]

+/-  "-"可用来指定变量的属性,"+"则是取消变量所设的属性。

a array,设置为普通索引数组

A Array,设置为key-value关联数组

r  readonly,将变量设置为只读, 也可以使用readonly

x  export,设置变量成为全局变量,也可以使用export

i  int,设置为整型变量。

f function,设置为一个函数变量

6.2 实例

# 设置整型变量age,赋值为20
declare -i age=20 # 取消整型限制
declare +i age # 设置只读属性
declare -r age

# 查看Shell所有变量与函数
declare

查看所有函数与定义
declare -f

查看所有函数名列表
declare -F

6.3 实现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定义普通数组,并获取打印元素数据的值

#!/bin/bash

declare -a arr1=(1 2 3 aa)
echo "${arr[1]}"
echo "${arr[*]}" declare -a arr2([0]=1 [1]=2 [2]=3 [4]=aa)
echo ${arr2[1]}
echo ${arr2[*]} declare -a arr2[3]=4
echo ${arr2[*]}

# 定义关联数组
declare -A arr4=([name]="icer" [age]=20 ["hobby"]="Shell")

注意: 使用参数-A 才是关联数组 , 关联数组无法使用索引获取

06-Shell内置命令的更多相关文章

  1. linux 获取shell内置命令帮助信息 help xx

    shell,命令解释器 shell内置命令有cd/umask/pwd等 help shell内置命令适用于所有用户获取shell内置命令的帮助信息help umaskhelp if

  2. Shell内置命令

    主要Shell内置命令 Shell有很多内置在其源代码中的命令.这些命令是内置的,所以Shell不必到磁盘上搜索它们,执行速度因此加快.不同的Shell内置命令有所不同. A.2.1  bash内置命 ...

  3. linux中shell内置命令和外置命令

    shell内置命令 无法通过which或者whereis去查找命令的位置 例如cd,cp这些命令是shell解释器内置的命令 当shell内置命令传入shell解释器,shell解释器通过内核获取相关 ...

  4. 6 shell内置命令

    知识点1:什么是shell内建命令? Shell 内建命令,就是由 Bash 自身提供的命令,而不是文件系统中的某个可执行文件. 内建命令与普通命令的性质是不一样的,内建命令并不是某个外部文件,只要在 ...

  5. shell内置命令和外部命令的区别

    内部命令实际上是shell程序的一部分,其中包含的是一些比较简单的linux系统命令,这些命令由shell程序识别并在shell程序内部完成运行,通常在linux系统加载运行时shell就被加载并驻留 ...

  6. shell内置命令eval的具有什么作用

    答:把变量中的内容当成命令来执行

  7. shell内置命令getopts

  8. Shell内置命令——declare

  9. Shell内置命令expr

  10. Shell内置命令let

随机推荐

  1. SpringCloud OpenFeign的使用

    SpringCloud OpenFeign的使用 是什么: 声明式http客户端. 目的: 使远程调用更简单 作用: 提供了http请求模板,仅需编写简单接口和插入注解,就可以定义好原始http请求的 ...

  2. Flutter定时器

    代码 const timeout = Duration(seconds: 3); var t=Timer.periodic(timeout, (timer) { print('afterTimer=' ...

  3. 在Global Mapper中导入点的文本格式

    目录 有时候想在Global Mapper快速显示一个点的具体位置,来不及去创建一个具体的矢量文件.一个最快速的方式就是将这个点写在文本文件中导入: 13149831.629692005 281725 ...

  4. Java 将PPT转为OFD

    本文以Java后端程序代码展示如何实现将PPT幻灯片转成OFD格式.下面是具体步骤. 步骤1:安装PPT库-Spire.Presentation for Java 方法一.通过Maven仓库安装.在p ...

  5. 云小课|ModelArts Pro 视觉套件:零代码构建视觉AI应用

    阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说).深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云.更多精彩内容请单击此处. 摘要:ModelArts ...

  6. 什么是MircoPython?

    摘要:互联网玩家为了让Python这样的容易学,简单易学.社区API丰富的语言可以在嵌入式领域用上,逐渐开始了一轮Python上嵌入式的迁移,这样就有了今天的主角--MircoPython. 本文分享 ...

  7. 华为云数据库内核专家为您揭秘:GaussDB(for MySQL)并行查询有多快?

    摘要:GaussDB(for MySQL)并行查询为何快人一步?华为云数据库内核专家这样说 本文分享自华为云社区<华为云数据库内核专家为您揭秘:GaussDB(for MySQL)并行查询有多快 ...

  8. 火山引擎DataTester:无需研发人力,即刻开启企业A/B实验

    近日,火山引擎A/B测试平台-- DataTester 对产品内A/B实验的"可视化编辑器"进行了新的升级,对交互.预览.Xpath的层次结构视图等能力均做了优化.   据介绍,火 ...

  9. allowedOrigins cannot contain the special value "*"

    Spring Boot的版本高于 2.4以后 ,原来的配置已经不适合目前的版本 将代码中的allowedOrigins改为allowedOriginPatterns @Configuration pu ...

  10. that the pod didn't tolerate, 2 Insufficient cpu.

    K8S Pod 一直处于 Pending 状态 有几个原因可以阻止 Pod 运行,但我们将描述三个主要问题: 调度问题:无法在任何节点上调度 Pod. 镜像问题:下载容器镜像时出现问题. 依赖性问题: ...