WenJunjie Blog

sysadmin

Learn Shell

| Comments

bash命令处理流程

                           +-------------+           单引号  
|------------------------->|             |--------------------------|  
|  ----------------------->| 1.分隔成记号|---- ---------------|     |  
|  |   ------------------->|             |      双引号        |     |  
|  |   |                   +-------------+                    |     |  
|  |   |                          ||                          |     |  
|  |   |读取下一个命令            \/                          |     |  
|  |   |     +-------------------------------------------+    |     |  
|  |   |     |                    2.                     |    |     |  
|  |   ------|              检验第一个记号               |    |     |  
|  |         |开放的关键字                    其他关键字 |    |     |  
|  |         |               非关键字                    |    |     |  
|  |         +-------------------------------------------+    |     |  
|  |                              ||                          |     |  
|  |                              \/                          |     |  
|  |            +-----------------------------+               |     |  
|  |  扩展别名  |           3. 检验第一个记号 |               |     |  
|  |------------|  别名                       |               |     |  
|               |              不是别名       |               |     |  
|               +-----------------------------+               |     |  
|                                 ||                          |     |  
|                                 \/                          |     |  
|                           +--------------+                  |     |  
|                           | 4.大括号扩展 |                  |     |  
|                           +--------------+                  |     |  
|                                 ||                          |     |  
|                                 \/                          |     |  
|                           +--------------+                  |     |  
|                           | 5.~符号扩展  |                  |     |  
|                           +--------------+                  |     |  
|                                 ||                          |     |  
|                                 \/                          |     |  
|                           +--------------+       双引号     |     |  
|                           |  6.参数扩展  |<-----------------|     |  
|                           +--------------+                        |  
|                                 ||                                |  
|                                 \/                                |  
|                    +------------------------------+               |  
|                    |  7.命令替换(嵌套命令行处理)  |               |  
|                    +------------------------------+               |  
|                                 ||                                |  
|                                 \/                                |  
|                           +--------------+      双引号            |  
|                           |  8.算术扩展  |------------------|     |  
|                           +--------------+                  |     |  
|                                 ||                          |     |  
|                                 \/                          |     |  
|                           +--------------+                  |     |  
|                           |  9.单词分割  |                  |     |  
|                           +--------------+                  |     |  
|                                 ||                          |     |  
|                                 \/                          |     |  
|                           +--------------+                  |     |  
|                           | 10.路径名扩展|                  |     |  
|                           +--------------+                  |     |  
|                                 ||                          |     |  
|                                 \/                          |     |  
|               +----------------------------------------+    |     |  
|               | 11.命令查寻:函数,内置命令,可执行文件|<---|-----|  
|               +----------------------------------------+  
|                                 ||  
|                                 \/  
|将参数带入下一个命令        +-------------+  
|----------eval--------------| 12.运行命令 |  
                             +-------------+  

bash调试

cat -n test.sh

检查语法错误 bash -n test.sh

显示行号 export PS4=‘+[$LINENO]’ export PS4=‘+${BASH_SOURCE}:${LINENO}:${FUNCNAME[0]}: ’ vim .bash_profile

跟踪整个脚本执行过程 bash -x test.sh

缩小排查错误范围 利用trap,调试钩子等输出关键调试信息,使用set -x及set +x对脚本片段进行重点跟踪

trap trap ‘command’ signal signal: EXIT ERR DEBUG trap ‘command’ EXIT trap ‘command’ 0

tee 将输入输出重定向某个文件进行查看调试

调试脚本片段 set -x 调试脚本 set +x

使用调试钩子

cat test.sh
#!/bin/bash
debug() {
    if [ "$_DEBUG" == "true" ]; then
        echo 1>&2 "$@"
    fi
}

debug "debuging…"
echo "test"

debug=true ./test.sh

DEBUG(){ [ "$DEBUG" = 0 ] && { echo "${BASH_LINENO}:$@ _"; $@; }; }
DEBUG set -x
DEBUG set +x

bash执行选项 -n 解析脚本,但不执行,可检查语法错误 -x 进行跟踪模式,显示执行的每一条命令 -c “string” 从string读取命令

-x选项增加 $LINENO 当前行号 $FUNCNAME 函数名称 ${FUNCNAME[0]} 当前正在执行的函数名称 ${FUNCNAME[1]} 调用函数${FUNCNAME[0]}的函数名称 $PS4 缺省是+

脚本复杂可使用开源调试器bashdb进行调试 bashdb

调试参考

学习资源

技巧

代码阅读

Comments