码迷,mamicode.com
首页 > 系统相关 > 详细

bash Shell 总结

时间:2018-04-12 15:34:58      阅读:207      评论:0      收藏:0      [点我收藏+]

标签:ja


man bash


1. shell 的工作原理 (1)


    内核 <---> shell <---> 用户

    父进程 fork --> wait

    子进程 exec --> exit

    相关man文档:

        fork(2)

        clone(2)

        execve(2)

        exit_group(2)

        exit4(2)

        strace(1) -->strace -e


2. shell 语法 (2)

    1. 简单命令 (kw: Simple Commands)

        基本形式:command [arg]...

        范例:

            cd

            ls -l

            cp /data/log /backup/log


    2. 管道 (kw: Pipelines)

        基本形式:cmd1 | cmd2 | cmd3   -->管道+小命令=复杂命令

    左边命令的标准输出作为右边命令的标准输入

用|&代替|,可以把标准错误也一起传给右边

管道中的每一个命令都在子进程中执行

管道中的命令同时运行

管道的返回状态是管道最右边的命令的返回状态

范例:

     ls /students|wc -l

ip a| grep -w inet

 

 


    3. 列表 (kw: Lists)

    一系列的管道就是列表

列表中用于分割管道的符合有:

        ;: 命令按顺序从左到右执行

        &: 命令同时执行

        &&: 左边成功才执行右边

        ||: 左边失败才执行右边

        列表的结尾可以有; &,如果是&,则最右边的管道放在后台执行


    4. 复合命令 (kw: Compound Commands)

        (list) 列表作为一个整体在子进程中执行

        { list; } 列表作为一个整体在当前进程中执行

        ((expression)) 算术运算

    ((n++))

((total=$first + $last))

        [[ expression ]]  当表达式为真时,返回0,否则返回非0,支持正则

        if, case, for, while 这些都是shell的流程控制指令


3. 引用 (1), (kw: QUOTING)

    shell 中的引用符号用于去除特殊字符的特殊意义

    1. 双引号 不能转义 $

    2. 单引号 转义所有的符合,除了'本身

    3. 反斜杠 单个字符


4. 参数 (2), (kw: PARAMETERS)

    Shell 参数是存放“值”的“东西”,它可以是一个名字,一个数字,或者是一些特殊符号。

    1. 变量

    2. 位置参数 (kw: Positional Parameters)

    3. 特殊参数 (kw: Special Parameters)

        $*: 所有位置参数合并成的一个字符串

        $@: 所有位置参数,如果放在双引号里面,则保存参数的边界

    4. shell 内置变量 (kw: Shell Variables)

    5. 阵列 (kw: Arrays)

        a=(e1 e2 e3)

        declare -A a

        a[x]=1

        a[y]=2

        ${name[0]}      <-- 获取第0个元素

        ${#name[*]}     <-- 阵列的长度

        ${!name[*]}     <-- 阵列的keys

        ${name[*]}      <-- 阵列的values

        unset name      <-- 删除整个阵列

        unset name[0]   <-- 删除阵列中的一个元素


5. 展开 (2), (kw: EXPANSION)

    shell 在执行命令之前,会对读到的命令行字符串做一系列的展开操作,常见的展开操作有:

    1. 大括号展开 (kw: Brace Expansion)

        {1..10}, {1..10..2}, {a..z}

        d{1,2,3} -> d1 d2 d3


        $ cp -v /tmp/a/b/c/deep{,2}

        ‘/tmp/a/b/c/deep’ -> ‘/tmp/a/b/c/deep2’


    2. 波浪号展开 (kw: Tilde Expansion)

        ~: 当前用户的家目录

        ~user:指定用户的家目录

        ~+: 当前工作目录

        ~-: 上一个工作目录


    3. 参数展开 (kw: Parameter Expansion)

        $, ${name}

        ${name:-default}        <-- 默认值

        ${name:offset}          <-- 截取字符串

        ${name:offset:length}   <-- 截取一定长度的字符串

        ${#name}                <-- 计算字符串长度

        ${name#word}            <-- 删除字符串头部

        ${name%word}            <-- 删除字符串尾部

        ${name/pattern/string}  <-- 字符串替换

        ${name^pattern}         <-- 转换成大写

        ${name,pattern}         <-- 转换成小写


    4. 命令替换 (kw: Command Substitution)

        $(cmd list)     <-- 当前应该使用这个

        `cmd list`      <-- 过时语法


    5. 算术展开 (kw: Arithmetic Expansion)

        $((expression))     <-- 当前应该使用这个

        $[expression]       <-- 过时语法


    6. 进程替换 (kw: Process Substitution)

        <(cmd list)

        >(cmd list)


    7. 路径名展开 (kw: Pathname Expansion)

        *, ?, []

        能展开则展开,不能展开则保持原样


6. 重定向 (1.5), (kw: REDIRECTION)

    在一个命令执行之前,它的输入和输出可能被shell重定向,重定向操作有以下功能:

    重定向输入 (kw: Redirecting Input, Here Documents, Here Strings)

        wc -l < file

        cmd <<EOF

        ..

        EOF

        cmd <<< "string"

    重定向输出 (kw: Redirecting Output)

    复制文件描述符 (kw: Duplicating File Descriptors)

        exec 4>&3   <-- 把3 复制成4

    移动文件描述符 (kw: Moving File Descriptors)

        exec 4>&3-  <-- 把3 移动到4

    关闭文件描述符

        exec 3>&-   <-- 关闭3

    以读写方式打开文件描述符 (kw: Opening File Descriptors for Reading and Writing)

        exec 3<>file    <-- 以读写形式打开


0 stdin 

1 stdout

2 stderr

7. 算术运算 (0.5)

    bash shell 支持整数算术运算

    1. ((expression)) (kw: ARITHMETIC EVALUATION)

    2. $((expression)) (kw: Arithmetic Expansion)

    3. 小数运算

        bc, python, awk

    

8. 简单命令的展开 (0.5), (kw: SIMPLE COMMAND EXPANSION)

    shell 执行简单命令时,在实际执行之前,会做以下操作:

        1. 取出变量赋值和重定向部分

        2. 对余下部分做展开操作

        3. 执行重定向操作

        4. 执行变量赋值操作

    简单命令展开完后,如果展开的结果中有命令名,则流程去到“命令的执行”阶段。


9. 命令的执行 (1), (kw: COMMAND EXECUTION)

    1. 如果命令名不包含斜杠,就按顺序搜索命令:

        1. 函数

        2. 内部命令

        3. 搜索PATH 中的目录

    2. 如果搜索成功,或者命令名包含了斜杠,则开始执行。

    3. 如果搜索失败,或者程序文件不存在,则返回127。


10. 命令的执行环境 (0.5), (kw: COMMAND EXECUTION ENVIRONMENT)

    1. 打开的文件

    2. 当前工作目录

    3. umask

    4. 信号trap   -->进程通讯

    5. shell 变量

    6. shell 函数

    7. shell 的功能选项(set, shopt) set -o vim/emacs

    8. shell 別名

    9. 各种进程ID ($$, $PPID)


11. 环境变量 (0.5), (kw: ENVIRONMENT)

    当一个命令被执行的时候,会有一个字符串阵列(列表)传给它,这个阵列叫做“环境”,也叫“环境变量”。

    shell 的环境变量可以传给子进程。设置shell 的环境变量的命令:

        1. export

            export time         <-- 把time 设置成环境变量

            export -n time      <-- 使time 编程非环境变量

        2. declare

            declare -x time     <-- 把time 设置成环境变量

            declare +x time     <-- 使time 编程非环境变量


12. shell 的内部命令 (4.5), (kw: SHELL BUILTIN COMMANDS)

     shell的内部命令默认在当前进程执行,常用的有

    01. :  空命令

    02. ., source

        点命令(source)把文件里面的代码读到“当前进程”中执行。

    03. break, continue

        break       <-- 结束整个循环

        continue    <-- 结束当前循环,进入下一轮循环

    04. cd, pwd

        cd          <-- 必须是内部命令

    05. declare, export, readonly, local

    06. set, unset, shopt   -》set改变shell的开关

    07. echo, read, printf

    08. exec

    09. exit, return

    10. kill, trap

    11. shift

    12. test, [

    13. wait


bash Shell 总结

标签:ja

原文地址:http://blog.51cto.com/395469372/2097407

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!