shell: bash和dash

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell: bash和dash相关的知识,希望对你有一定的参考价值。

参考技术A 两种方法:

sudo ln -s /bin/bash /bin/sh
强制把/bin/sh的软链接改到bash中。

sudo dpkg-reconfigure dash
弹出来个选择项,把“dash设为默认shell”选择no。

文件开头加上 #!/bin/bash
该脚本拥有执行权限,通过脚本名直接运行时,使用bash执行

1.定义函数

bash: function在bash中为关键字

dash: dash中没有function这个关键字

2.select var in list; do command; done

bash:支持

dash:不支持, 替代方法:采用while+read+case来实现

bash:支持n..m展开

dash:不支持,替代方法, 采用seq外部命令

bash:支持here string

dash:不支持, 替代方法:可采用here documents

bash: 当word为非数字时,>&word变成重定向标准错误和标准输出到文件word

dash: >&word, word不支持非数字, 替代方法: >word 2>&1; 常见用法 >/dev/null 2>&1

bash: 支持数组, bash4支持关联数组

dash: 不支持数组,替代方法, 采用变量名+序号来实现类似的效果

bash: 支持 parameter:offset

dash: 不支持, 替代方法:采用expr或cut外部命令代替

bash: 支持 parameter^^pattern, parameter,,pattern

dash: 不支持,替代方法:采用tr/sed/awk等外部命令转换

bash: 支持进程替换

dash: 不支持, 替代方法, 通过临时文件中转

bash: 支持两者

dash: 只支持=

bash: 支持[[ ]], 可实现正则匹配等强大功能

dash: 不支持[[ ]], 替代方法,采用外部命令

bash: 支持C语言格式的for循环

dash: 不支持该格式的for, 替代方法,用while+$((expression))实现

bash: 有内置命令let, 也支持((expression))方式

dash: 不支持,替代方法,采用$((expression))或者外部命令做计算

bash: 支持id++,id--,++id,--id这样到表达式

dash: 不支持++,--, 替代方法:id+=1,id-=1, id=id+1,id=id-1

参考:
http://www.linuxfly.org/post/686/

了解 dash shell 与 zsh shell

#其他shell: dash shell,zsh shell
    dash shell
        dash shell特性
        尽管bash shell和dash shell都以Bourne shell为样板,由于dash的目标是简洁,因此它的环境变量比bash shell少多了。dash变量和bash变量之间有一个巨大的差异,dash shell不支持数组。
        一、dash 命令行参数
            dash命令行参数
            参 数  描 述
            -a       导出分配给shell的所有变量
            -c       从特定命令字符串中读取命令
            -e       如果是非交互式shell的话,在有未经测试的命令失败时立即退出
            -f       显示路径名通配符
            -n       如果是非交互式shell的话,读取命令但不执行它们
            -u       在尝试展开一个未设置的变量时,将错误消息写出到 STDERR
            -v       在读取输入时将输入写出到 STDERR
            -x       在执行命令时将每个命令写出到 STDERR
            -I       在交互式模式下,忽略输入中的 EOF 字符
            -i       强制shell运行在交互式模式下
            -m       启用作业控制(在交互式模式下默认开启)
            -s       从 STDIN 读取命令(在没有指定文件参数时的默认行为)
            -E       启用emacs命令行编辑器
            -V       启用vi命令行编辑器    
        二、dash 环境变量
            1. 默认环境变量
                dash shell用 set 命令来显示环境变量
            2. 位置参数
                $0 :shell的名称。
                $n :第n个位置参数。
                $* :含有所有参数内容的单个值,由 IFS 环境变量中的第一个字符分隔;没定义 IFS 的话,由空格分隔。
                [email protected] :将所有的命令行参数展开为多个参数。
                $# :位置参数的总数。
                $? :最近一个命令的退出状态码。
                $- :当前选项标记。
                $$ :当前shell的进程ID(PID)。
                $! :最近一个后台命令的PID。
            3. 用户自定义的环境变量
                $ testing=10 ; export testing    -- 如果不用 export 命令,用户自定义的环境变量就只在当前shell或进程中可见
                $ echo $testing
                10
        三、dash 内建命令
            dash shell内建命令
            命 令        描 述
            alias        创建代表文本字符串的别名字符串
            bg           以后台模式继续执行指定的作业
            cd           切换到指定的目录
            echo         显示文本字符串和环境变量
            eval         将所有参数用空格连起来 ①
            exec         用指定命令替换shell进程
            exit         终止shell进程
            export       导出指定的环境变量,供子shell使用
            fg           以前台模式继续执行指定的作业
            getopts      从参数列表中中提取选项和参数
            hash         维护并提取最近执行的命令及其位置的哈希表
            pwd          显示当前工作目录
            read         从 STDIN 读取一行并将其赋给一个变量
            readonly     从 STDIN 读取一行并赋给一个只读变量
            printf       用格式化字符串显示文本和变量
            set          列出或设置选项标记和环境变量
            shift        按指定的次数移动位置参数
            test         测试一个表达式,成立的话返回 0 ,不成立的话返回 1
            times        显示当前shell和所有shell进程的累计用户时间和系统时间
            trap         在shell收到某个指定信号时解析并执行命令
            type         解释指定的名称并显示结果(别名、内建、命令或关键字)
            ulimit       查询或设置进程限制
            umask        设置文件和目录的默认权限
            unalias      删除指定的别名
            unset        从导出的变量中删除指定的变量或选项标记
            wait         等待指定的作业完成,然后返回退出状态码
        dash 脚本编程
            创建 dash 脚本
                在shell脚本的第一行指定:#!/bin/dash
            不能使用的功能
                1. 算术运算
                    dash shell支持 expr 命令和双圆括号方法,但不支持方括号方法。
                2.  test 命令
                     test 命令不能识别用作文本比较的==符号,只能识别=符号
                3.  function 命令
                    dash shell不支持 function 语句。在dash shell中,你必须用函数名和圆括号定义函数:
                        func1() 
                        echo "This is an example of a function"
                        
    zsh shell
        zsh shell提供了一组核心内建命令,并提供了添加额外命令模块(command module)的能力。
        zsh shell 的组成
            shell 选项
                zsh shell命令行参数
                    参 数  描 述
                    -c     只执行指定的命令,然后退出
                    -i     作为交互式shell启动,提供一个命令行交互提示符
                    -s     强制shell从 STDIN 读取命令
                    -o     指定命令行选项
                    -o 参数有些容易让人误解。它允许你设置shell选项来定义shell的功能。到目前为止,zsh shell是所有shell中可定制性最强的
            内建命令
                1. 核心内建命令
                    zsh核心内建命令
                    命 令            描 述
                    alias            为命令和参数定义一个替代性名称
                    autoload         将shell函数预加载到内存中以便快速访问
                    bg               以后台模式执行一个作业
                    bindkey          将组合键和命令绑定到一起
                    builtin          执行指定的内建命令而不是同样名称的可执行文件
                    bye              跟 exit 相同
                    cd               切换当前工作目录
                    chdir            切换当前工作目录
                    command          将指定命令当作外部文件执行而不是函数或内建命令
                    declare          设置变量的数据类型(同 typeset )
                    dirs             显示目录栈的内容
                    disable          临时禁用指定的散列表元素
                    disown           从作业表中移除指定的作业
                    echo             显示变量和文本
                    emulate          用zsh来模拟另一个shell,比如Bourne、Korn或C shell
                    enable           使能指定的散列表元素
                    eval             在当前shell进程中执行指定的命令和参数
                    exec             执行指定的命令和参数来替换当前shell进程
                    exit             退出shell并返回指定的退出状态码。如果没有指定,使用最后一条命令的退出状态码
                    export           允许在子shell进程中使用指定的环境变量名及其值
                    false            返回退出状态码 1
                    fc               从历史记录中选择某范围内的命令
                    fg               以前台模式执行指定的作业
                    float            将指定变量设为保存浮点值的变量
                    functions        将指定名称设为函数
                    getln            从缓冲栈中读取下一个值并将其放到指定变量中
                    getopts          提取命令行参数中的下一个有效选项并将它放到指定变量中
                    hash             直接修改命令哈希表的内容
                    history          列出历史记录文件中的命令
                    integer          将指定变量设为整数类型
                    jobs             列出指定作业的信息,或分配给shell进程的所有作业
                    kill             向指定进程或作业发送信号(默认为 SIGTERM )
                    let              执行算术运算并将结果赋给一个变量
                    limit            设置或显示资源限制
                    local            为指定变量设置数据属性
                    log              显示受 watch 参数 ① 影响的当前登录到系统上的所有用户
                    logout           同 exit ,但只在shell是登录shell时有效
                    popd             从目录栈中删除下一项
                    print            显示变量和文本
                    printf           用C风格的格式字符串来显示变量和文本
                    pushd            改变当前工作目录,并将上一个目录放到目录栈中
                    pushln           将指定参数放到编辑缓冲栈中
                    pwd              显示当前工作目录的完整路径名
                    read             读取一行,并用 IFS 变量将数据字段赋给指定变量
                    readonly         将值赋给不能修改的变量
                    rehash           重建命令散列表
                    set              为shell设置选项或位置参数
                    setopt           为shell设置选项
                    shift            读取并删除第一个位置参数,然后将剩余的参数向前移动一个位置
                    source           找到指定文件并将其内容复制到当前位置
                    suspend          挂起shell的执行,直到它收到 SIGCONT 信号
                    test             如果指定条件为 TRUE 的话,返回退出状态码 0
                    times            显示当前shell以及shell中所有运行进程的累计用户时间和系统时间
                    trap             阻断指定信号从而让shell无法处理,如果收到信号则执行指定命令
                    true             返回退出状态码 0
                    ttyctl           锁定和解锁显示
                    type             显示shell会如何解释指定的命令
                    typeset          设置或显示变量的特性
                    ulimit           设置或显示shell或shell中运行进程的资源限制
                    umask            设置或显示创建文件和目录的默认权限
                    unalias          删除指定的命令别名
                    unfunction       删除指定的已定义函数
                    unhash           删除散列表中的指定命令
                    unlimit          取消指定的资源限制
                    unset            删除指定的变量特性
                    unsetopt         删除指定的shell选项
                    wait             等待指定的作业或进程完成
                    whence           显示指定命令会如何被shell解释
                    where            如果shell找到的话,显示指定命令的路径名
                    which            用csh风格的输出显示指定命令的路径名
                    zcompile         编辑指定的函数或脚本,加速自动加载
                    zmodload         对可加载zsh模块执行特定操作
                2. 附加模块
                    模 块            描 述
                    zsh/datetime     额外的日期和时间命令及变量
                    zsh/files        基本的文件处理命令
                    zsh/mapfile      通过关联数组来访问外部文件
                    zsh/mathfunc     额外的科学函数
                    zsh/pcre         扩展的正则表达式库
                    zsh/net/socket   Unix域套接字支持
                    zsh/stat         访问stat系统调用来提供系统的统计状况
                    zsh/system       访问各种底层系统功能的接口
                    zsh/net/tcp      访问TCP套接字
                    zsh/zftp         专用FTP客户端命令
                    zsh/zselect      阻塞,直到文件描述符就绪才返回
                    zsh/zutil        各种shell实用工具
                3. 查看、添加和删除模块
                    zmodload 命令是zsh模块的管理接口。通常习惯将 zmodload 命令放进$HOME/.zshrc启动文件中,这样在zsh启动时常用的函数就会自动加载。
                    zmodload 命令不加任何参数会显示zsh shell中当前已安装的模块。
                        % zmodload
                        zsh/zutil
                        zsh/complete
                        zsh/main
                        zsh/terminfo
                        zsh/zle
                        zsh/parameter
                    % zmodload zsh/zftp    -- 在 zmodload 命令行上指定模块名称,添加新模块 zsh/zftp。加载成功不会显示信息。
                    % zmodload -u zsh/zftp    -- 要删除已安装的模块,用 -u 参数和模块名。                    
        zsh 脚本编程
            数学运算
                1. 执行计算
                sh shell提供了执行数学运算的两种方法:
                    ①let 命令
                    ②双圆括号    
                    % let value1=" 4 * 5.1 / 3.2 "    -- 在使用 let 命令时,你应该在算式前后加上双引号,这样才能使用空格
                    % echo $value1
                    6.3750000000    
                    % printf "%6.3f\n" $value1    -- 使用浮点数会带来精度问题。为了解决这个问题,通常要使用 printf 命令,并指定能正确显示结果所需的小数点精度
                    6.375
                    % value1=$(( 4 * 5.1 ))    -- 使用双圆括号
                    % (( value2 = 4 * 5.1 ))
                    % printf "%6.3f\n" $value1 $value2
                    20.400
                    20.400
                2. 数学函数
                    如果安装了 zsh/mathfunc 模块,你就会拥有远远超出你可能需要的数学函数    
                        % value1=$(( sqrt(9) ))
                        zsh: unknown function: sqrt
                        % zmodload zsh/mathfunc
                        % value1=$(( sqrt(9) ))
                        % echo $value1
                        3.    
            结构化命令
                zsh shell为shell脚本提供了常用的结构化命令:
                if-then-else 语句
                for 循环(包括C语言风格的)
                while 循环
                until 循环
                select 语句
                case 语句
                zsh中的每个结构化命令采用的语法都跟你熟悉的bash shell中的一样。zsh shell还包含了另外一个叫作 repeat 的结构化命令
                repeat 命令:
                    repeat param    -- param 参数必须是一个数字或能算出一个数值的数学算式
                    do
                        commands    
                    done
                    % cat test1
                    #!/bin/zsh
                    # using the repeat command
                    value1=$(( 10 / 2 ))  -- 值为5,执行5次
                    repeat $value1
                    do
                        echo "This is a test"
                    done
                    $ ./test1
                    This is a test
                    This is a test
                    This is a test
                    This is a test
                    This is a test
            函数
                zsh shell支持使用 function 命令或通用圆括号定义函数名的方式来创建自定义函数
                    % function functest1 
                    > echo "This is the test1 function"
                    
                    % functest2() 
                    > echo "This is the test2 function"
                    
                    % functest1
                    This is the test1 function
                    % functest2
                    This is the test2 function

 

以上是关于shell: bash和dash的主要内容,如果未能解决你的问题,请参考以下文章

相当于 dash shell 中的 pipefail

Ubuntu下把缺省的dash shell修改为bash shell

《Linux命令行与shell脚本编程大全》23章24章

shell初步了解

《Linux命令行与shell脚本编程大全》 第五章理解shell

关于Linux shell,还有bash