• Shell:内置命令


    内置命令介绍

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

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

    image-20210517205425810

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

    内置命令列表

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

    image-20210517205756333

    上面是系统为了方便命令操作默认将部分命令创建为别名 ll 的命令与ls -l的效果一样, 就是因为ll是别名

    alias别名定义语法

    alias 别名='命令'
    

    image-20210517210047824

    例如我设置la='ls -al',然后直接执行la,就可以查看当前目录下所有文件列表。

    unalias 别名删除语法

    删除指定的别名

    unalias 别名
    

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

    unalias -a
    

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

    image-20210517210404375

    echo

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

    echo输出语法

    默认输出换行语法

    echo 字符串
    

    输出不换行语法

    echo -n  字符串
    

    image-20210517211141636

    echo输出转义字符

    /n 转义字符

    用于echo输出字符串非结尾处的换行, 但是默认echo无法解析/n 转义字符

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

    image-20210517211350485

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

    image-20210517211502916

    read

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

    语法

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

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

    optionsvar都是可选的,如果没有提供变量名,那么读取的数据将存放到环境变量 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 作为输入源,而不是标准输入,类似于重定向。

    使用 read 命令给多个变量赋值

    vi my.sh
    
    #!/bin/bash
    read -p "请输入姓名,年龄,爱好: " name age hobby
    echo "姓名:$name"
    echo "年龄:$age"
    echo "爱好:$hobby"
    

    image-20210517212551457

    读取一个字符

    需求:从终端控制台只读取一个字符

    vi my2.sh
    
    #!/bin/bash
    read -n 1 -p '请输入一个字符: ' char
    printf '
    '
    echo '你输入的字符为:'$char
    

    image-20210517212907415

    注意

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

    printf ' '语句用于换行,否则 echo 的输出结果会和用户输入的内容位于同一行,不容易区分

    限制时间输入

    vi my3.sh
    
    #!/bin/bash
    read -t 20 -sp '请输入密码(20秒内):' pwd1
    printf '
    '
    read -t 20 -sp '请再次输入密码(20秒内):' pwd2
    printf '
    '
    if
            [ $pwd1 == $pwd2 ]
    then
            echo '密码与确认密码一致, 验证通过'
    else
            echo '密码与确认密码不一致,验证失败'
    fi
    

    image-20210517213352351

    -t 可以设置超时时间

    exit

    exit 用于退出当前 Shell 进程结束运行,并返回一个退出状态;使用$?可以接收这个退出状态.

    exit 命令可以接受一个整数值作为参数,代表退出状态。如果不指定,默认状态值是 0。

    一般情况下,退出状态为 0 表示成功,退出状态为非 0 表示执行失败(出错)了。

    语法

    正确退出语法

    exit
    

    错误退出语法

    exit 非0数字  # 介于 0~255 之间的整数,其中只有 0 表示成功,其它值都表示失败
    

    exit应用场景

    1.结束当前Shell进程

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

    比如打开一个文件时,可以返回1 表示文件不存在,2 表示文件没有读取权限,3 表示文件类型不对。

    declare

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

    declare命令作用

    1.declare设置变量的属性

    2.查看全部Shell变量与函数

    3.实现关联数组变量

    不同于普通数组, 关联数组的下标是字符串, 通过字符串下标操作数据

    语法

    1.declare设置变量的属性语法

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

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

    a 设置为普通索引数组

    A 设置为key-value关联数组

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

    x  设置变量成为环境变量,也可以使用export

    i  设置为整型变量。

    f 设置为一个函数变量

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

    declare [-fF]
    

    declare 后无参数, 查询全部Shell变量与函数定义

    -f  仅查询显示函数定义。

    -F 仅查询显示函数名字

    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
    

    测试

    image-20210517214235353

    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-20210517214418475

  • 相关阅读:
    SSRS 2012 创建ReportServer数据库失败: The RPC server is not listening. (Exception from HRESULT: 0x800706B3)
    关于SSIS包调用,把Execute out of Process 设成True后运行失败问题
    Mark:Insert, Update, and Delete Destination table with SSIS
    转SSIS 2012 pass values from child package to parent with project deployment model
    [转]SSIS Parameter和Variable的区别
    转SQL SERVER – SSIS Parameters in Parent-Child ETL Architectures – Notes from the Field #040
    简单的plsql to tsql ,游标拆解
    TSQL 根据表名生成UPDATE SELECT INSERT
    SPLIT CURSOR INTO ROWSET DML
    c/c++ tricks
  • 原文地址:https://www.cnblogs.com/wwjj4811/p/14778749.html
Copyright © 2020-2023  润新知