Loading

【Shell】内置命令

内置命令介绍

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

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

    image

  • 内置命令与外部的脚本文件执行区别

    • 内置命令: 执行速度快, 内置命令执行是当前Shell环境的一部分, 就在当前进程内执行, 减少了上下文切换

    • 外部的脚本文件: 执行速度慢, 需要磁盘I/O操作, 并且是fork一个新的进程运行脚本文件,导致进程之间上下文切换

内置命令列表

命令说明
:扩展参数列表,执行重定向操作
.读取并执行指定文件中的命令(在当前 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设置别名

alisa 用于给命令创建别名

  • 好处

    可以将经常操作比较复杂的命令进行设置别名, 通过别名的操作提高工作效率

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

    image

  • alias别名定义语法

    alias 别名="命令"
    
  • unalias 别名删除语法

    • 删除指定的别名

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

      unalias -a
      

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

  • alias演示

    • 输出所有进行信息
      ps -aux
      
    • 给上面的命令起别名为psList, 并使用psList输出
      [root@gh ~] alias psList="ps -aux"
      
      image
    • 删除psList别名
      image

echo输出字符串

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

  • echo输出语法

    • 默认输出换行语法:

      echo 字符串
      
    • 输出不换行语法:

      echo -n  字符串
      
  • 演示

    • 创建echo1.sh

      touch echo1.sh
      
    • 编辑文件内容并保存

      vim echo1.sh
      
      # 文件内容
      #!/bin/bash
      echo "hello"
      echo "world"
      echo -n "itheima "
      echo -n "shell "
      
    • 运行echo1.sh文件观察效果
      image

  • echo输出转义字符

    -e参数用于解析转义字符

    echo -e '字符串中含有转义字符'
    
    image
    • \n 转义字符

      用于echo输出字符串非结尾处的换行

      image

    • \c 转义字符

      用于强制清除echo的结尾换行输出

      image

read读取控制台输入

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

  • 语法

    read [-options] [var1 var2 ...] # 省略的话,默认输入到$REPLY中
    
    options表示选项,如下表所示;var表示用来存储数据的变量,可以有一个,也可以有多个。
    options和var都是可选的,如果没有提供变量名,那么读取的数据将存放到环境变量 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 作为输入源,而不是标准输入,类似于重定向。
  • 使用 read 命令给多个变量赋值-p

    • 创建文件
      touch read1.sh
      
    • 编辑文件
      #!/bin/bash
      read -p "请输入姓名,年龄,爱好: " name age hobby
      echo "姓名:${name}"
      echo "年龄:${age}"
      echo "爱好:${hobby}"
      
    • 执行文件运行效果
      image
  • 从终端控制台只读取一个字符,回答Y/N那种-n

    # 使用read命令读取数据,要有提示信息"您确定要删除数据吗?(请输入y/n):" 并且设置读取一个字符
    # 打印这个字符输出

    • 创建文件

      touch read2.sh
      
    • 编辑文件

      #!/bin/bash
      read -p '您确定要删除数据吗?(请输入y/n):' -n 1 char
      # 或者 read -n 1 -p '您确定要删除数据吗?(请输入y/n):'  char 
              # -n设置读取几个字符 
              # 1 读取一个字符
              # 变量是接收字符的 定义变量char
              # -n 和 -p 没有前后顺序
                  # 添加换行,因为输入一个字符read就结束了,没有等用户回车,所有添加换行 
      printf '\n' # 可以直接打印字符串,可以直接写转义字符 同时也可以使用一个echo代替
      echo '你输入的字符为:'$char
      

      -n 1只读取一个字符。运行脚本后,只要输入的一个字符,立即读取结束,不用等待用户按下回车键。

    • 执行文件运行效果

      sh read2.sh 报错read2.sh: 2: read: Illegal option -n

      image

  • 限制时间输入-t

    • 创建文件
      touch read3.sh
      
    • 编辑文件
      #!/bin/bash
      read -t 20 -sp '请输入密码(20秒内):' pwd1 # s静默模式(看不到) p密码
      echo
      read -t 20 -sp '请再次输入密码(20秒内):' pwd2
      printf '\n'
      if
        [ $pwd1 == $pwd2 ]
      then # 成立
        echo '密码与确认密码一致, 验证通过'
      else
        echo '密码与确认密码不一致,验证失败'
      fi #结束
      
    • 执行文件运行效果
      image

exit退出

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

  • 语法:

    • 正确退出语法
      exit  # 默认返回状态码0,一般代表命令执行成功
      
    • 错误退出语法
      exit 非0数字 # 数字建议的范围0~255,一般代表命令执行失败
      
  • exit应用场景

    1. 结束当前Shell进程
    2. 当Shell 进程执行出错退出时,可以返回不同的状态值代表不同的错误
  • 示例

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

    • 创建文件
      touch exit.sh
      
    • 编辑文件
      #!/bin/bash
      echo 'one'
      exit 6
      echo 'two'
      
    • 执行文件运行效果
      image

declare设置变量

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

  • declare命令作用

    1. declare设置变量的属性[重要]
    2. 查看全部Shell变量与函数
    3. 实现关联数组变量[重要]
  • declare设置变量的属性语法

    declare [+/-][aArxif][变量名称=设置值]
    
    • +/- "-“可用来指定变量的属性,”+"则是取消变量所设的属性。
    • a array,设置为普通索引数组,类比于python列表
    • A Array,设置为key-value关联数组,类比于python字典
    • r readonly,将变量设置为只读, 也可以使用readonly
    • x exprot,设置变量成为全局变量,也可以使用export
    • i int,设置为整型变量。
    • f function,设置为一个函数变量
  • 示例1:设置变量属性

    操作一个变量属性, 设置为整型\ 取消整型\设置为只读等操作

    image

  • 示例2:实现普通索引数组(python列表)

    • 创建文件
      touch declare1.sh
      
    • 编辑文件
      #!/bin/bash
      declare -a arr1=(1 2 3 aa)
      echo ${arr1[1]}
      echo ${arr1[*]}
      
      declare -a arr2=([0]=1 [1]=2  [2]=3  [4]=aa)
      echo ${arr2[1]}
      echo ${arr2[*]}
      
      declare -a arr2[3]=4
      echo ${arr2[*]}
      
    • 执行文件运行效果
      image
  • 示例3:实现key-value关联数组(python字典)

    image

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

    image

  • 查看全部Shell变量与函数定义语法

    declare [-fF]
    
    # declare 后无参数, 查询全部Shell变量与函数定义, 与set功能一模一样
    # -f 查询仅显示函数定义
    # -F 查询仅显示函数名字
    

    image

    image

    image

posted @ 2023-02-12 20:31  爱learn  阅读(163)  评论(0编辑  收藏  举报