一、颜色输出能提升脚本交互体验

原笔记专门整理了一组常见 ANSI 转义码,用于在终端中输出彩色文本。核心形式是:

echo -e "\e[1;31mThis is red text\e[0m"

这里:

  • \e[ 表示颜色控制开始
  • 1;31m 表示红色粗体
  • 0m 表示恢复默认样式

常见颜色里最实用的几种通常是:

  • \e[31m:红色
  • \e[32m:绿色
  • \e[33m:黄色
  • \e[34m:蓝色
  • \e[0m:重置

在脚本里,绿色常用来表示成功,红色常用来表示失败。

二、把颜色封装成函数比直接写转义码更好

原笔记最有价值的部分,是把颜色输出做成函数库文件:

#!/bin/bash

redecho() {
    echo -ne "\e[5;31m"
    echo -n "$@"
    echo -e "\e[0m"
}

greenecho() {
    echo -ne "\e[1;32m"
    echo -n "$@"
    echo -e "\e[0m"
}

blueecho() {
    echo -ne "\e[1;34m"
    echo -n "$@"
    echo -e "\e[0m"
}

check_rc() {
    command "$1"
    if [ $? -eq 0 ]; then
        greenecho "$1 命令执行成功"
    else
        redecho "$1 命令执行失败"
    fi
}

调用时只需要:

. /server/scripts/devops-shell/32.color-func.sh
check_rc id
check_rc badcmd

这就是典型的“函数库化”思路:把通用能力抽出来,其他脚本直接复用。

三、图形化终端工具属于了解项

原笔记提到了 dialog,可以在终端中弹出文本框等界面:

yum install -y dialog
dialog --textbox /etc/hostname 80 80

不过课程也明确建议:实际工作里更常见的还是“颜色输出 + 清晰文本提示”,真正依赖 GUI 的 Shell 脚本并不多。

四、数组是批量处理相关数据的基础能力

原笔记把数组定义为“可以存放多个相关联内容的变量”。最基础的创建方式如下:

ip_array=(10.0.0.61 10.0.0.71 10.0.0.81)
echo ${ip_array[0]}
echo ${ip_array[2]}

输出全部元素:

echo ${ip_array[@]}
echo ${ip_array[*]}

统计数组长度:

echo ${#ip_array[@]}
echo ${#ip_array[*]}

对 Shell 自动化脚本来说,数组最常见的价值是:

  • 保存一组主机
  • 保存一组目录
  • 保存一组待处理对象

五、数组如何赋值和遍历

原笔记整理了 3 种常见赋值方式:

  • 批量直接赋值:array=(a b c)
  • 逐个元素赋值:array[0]=a
  • read -a 交互赋值

从文件读内容形成数组也很常见:

ip_list=(`cat ip.txt`)
echo ${ip_list[@]}
echo ${#ip_list[@]}

数组遍历推荐下面这种写法:

names=(web01 web02 db01 nfs01 backup)
for n in ${names[@]}
do
    ping -c 1 -W 1 $n
done

如果确实需要按下标访问,再考虑 C 风格循环。

六、案例:读取多个数字后计算总和和平均值

原笔记里数组最完整的案例,是读取用户输入的一组数字,再计算总和与平均值:

#!/bin/bash
tmp_file=${0}_$$.txt

check_num() {
    if [ "$num" = "q" ]; then
        echo "输入完成,准备进行计算"
        break
    fi

    if [[ ! $num =~ ^[0-9]+$ ]]; then
        echo "输入异常,请重新输入数字"
        continue
    fi
}

read_num() {
    while :
    do
        read -p "请逐个输入数字,完成后按q结束: " num
        check_num
        echo $num >> $tmp_file
    done
}

calc_num() {
    num_array=(`cat $tmp_file`)
    sum=0
    for n in ${num_array[@]}
    do
        let sum=sum+n
    done

    echo "总数:$sum"
    echo "平均值:"
    echo "$sum/${#num_array[@]}" | bc -l
}

main() {
    read_num
    calc_num
}

main

这个案例把数组、循环、正则校验和 bc 计算都串到了一起,综合性很强。

七、脚本编写习惯会直接影响后期维护成本

原笔记在 Debug 章节前先列出了几个值得长期坚持的习惯:

1、适当加注释。 2、尽量使用变量,不要到处硬编码。 3、尽量使用函数,把逻辑模块化。 4、关键步骤要有返回值和退出码。 5、参数与选项要先检查。 6、必要时通过 echo 输出关键过程。 7、注意缩进。 8、成对符号提前补全好,例如 ""[]{}

这些内容看起来不“炫技”,却最能决定脚本能不能长期维护。

八、调试 Shell 脚本最实用的 4 种方法

原笔记给出的 Debug 方法非常贴近实际:

8.1 直接用 bash -x

bash -x script.sh

这是最常用也最直接的调试方式,会把执行过程一行行打印出来。

8.2 局部打开调试

如果脚本很大,可以只调试局部:

set -x
# 需要观察的代码
set +x

8.3 注释法和排除法

把函数或模块临时注释掉,逐步缩小问题范围。这种方法虽然朴素,但在大脚本里很有效。

8.4 输出关键变量

在关键节点输出变量值,观察脚本实际执行到了哪里、数据是否符合预期。

九、这一篇最值得真正带走的东西

把颜色输出、数组和调试方法放在一起看,会发现它们共同解决的是同一个问题:让脚本更容易被人使用,也更容易被人维护。

因此,最值得养成的长期习惯是:

  • 通用能力函数化
  • 批量数据数组化
  • 排障过程可视化

脚本一旦进入多人协作、长期运行或定时任务场景,这些“辅助能力”就会比单次写对一个命令更重要。