1 介绍

本文介绍一些我写 Bash 脚本常用的技巧,帮助我们写一些比较复杂的 Bash 脚本。说句题外话,我个人觉得用 Bash 写脚本还是比 Python 方便,当然用 Python 写更简单,门槛更低。但是 Python 太大了,很多嵌入式系统中根本不适合安装,而 Bash 的话就没有这个问题。从我的经验来说,我觉得嵌入式系统更适合用 Bash,功能也足够强大。

2 通用模块

1 命令行解析

Bash 脚本通常需要通过命令行输入参数,这时候一个好的命令行解析功能就相当重要。这里提供一个可以解析 Option 和 Command 的解析函数。

#! /usr/bin/env bash

COMMAND=""

# hint for users
function show_usage() {
	    cat <<EOF
Usage: $0 [options] ...
OPTIONS:
    -h, --help              Display this help and exit.
    -a, --aoption           Change it to your option.
    -b, --boption           Change it to your option.
    acommand             	Change it to your command.
    bcommand		        Change it to your command.
EOF
}

function acommand() {
    # do acommand
}

function bcommand() {
    # do bcommand
}

function parse_cmdline() {
    # show hint when there is no args
    if [ "$#" -eq 0 ]; then
        show_usage
        exit 0
    fi

    while [ $# -gt 0 ]; do
        local cmd="$1"
        shift
        case "${cmd}" in
            acommand)
                COMMAND="start"
                ;;
            bcommand)
                COMMAND="save"
                ;;
            -a| --aoption)
                some_avalue=$1
                shift
                ;;
            -b| --boption)
                some_bvalue=$1
                shift
                ;;                
            -h | --help)
                show_usage
                exit 0
                ;;
            -* | --*)
                show_usage
                exit 1
                ;;
        esac
    done
}

parse_cmdline "$@"
${COMMAND}

3 一些技巧

  • 经常使用 bash -c

当我们需要执行多条命令,并且可能涉及到一些改变当前环境的操作时,我们可以使用 bash -c “commnad1; command2; command3”,这样会创造出一个独立的 bash 环境,方便的将这些组合命令在一个环境中执行完成。 前面也可以加上 sudo 创造一个 root 环境。

  • ssh 运行后台命令时记得加上 >/dev/null 2>&1 &

如果不加,进程会一直有输出到 ssh tunnel,而由于是后台进程,tunnel 执行完已经关闭了,会导致执行出错。总之在使用 ssh 运行长时间命令的时候尽量不要输出,有输出会很容易出现问题。