나 는 더 이상 걱정 하지 않 겠 다. 스스로 Shell 스 크 립 트 를 배 울 수 없다.

3804 단어
리 눅 스 를 자주 접 하 는 프로그래머 로 서 셸 스 크 립 트 는 필수 적 이다.
그러나 상고 시대 에 태 어 난 Shell 은 지금 은 시대 에 심각하게 뒤떨어 졌 기 때문에 일련의 가장 좋 은 실천 을 통 해 문법 적 취약 성에 저항 해 야 한다. 다음은 정리 이다.
방어 식 프로 그래 밍, 어 쩔 수 없 는 선택
모든 Shell 스 크 립 트 는 파일 헤더 에 상세 한 설명 을 추가 하 는 것 이 좋 습 니 다.
#!/usr/bin/env bash                                           指明 Bash
#
# @date:                                                      创建日期
# @author:                                                    作者
# @license:                                                   授权信息
#
#                                                             版权的详细声明
#
#                                                             脚本干嘛用的, 详细说明

set -e                                                        脚本某处出错, 立即退出, 不继续执行
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH                                                   PATH变量的设置, 防止子进程找不到命令

스 크 립 트 를 실행 하면 항상 오류 가 발생 하지만 원인 을 찾 을 수 없습니다. 이 때 는 Debug 가 필요 합 니 다.
$ bash -x $file.bash         这样能展示该文件的详细执行过程              

기초 문법
变量
        var1=value1                     = 两边不能有空格
        var2=value2
        使用变量
            "${var1}"                   推荐做法, 让你更少出错( 虽然单词更多 )
            "${var2}"

数组
    arr1=( value1 value2 value3 )
    使用数组
        # 我也不知道为什么要这样用,但是根据「无法抵抗就好好享受」之定理,咱们先这样用着吧
        # 是不是觉得写法特别恶心啊?少年,看你有一双慧眼,不如跟我学......
        for val in "${arr1[@]}"; do

        done

流程控制
    if [ $condition ]; then
        $statements
    elif [ $condition ]; then
        $statements
    else
        $statements
    fi

    for $var in $array; do
        $statements
    done
    for (( i=0; i < 10; i++)); do
        $statements
    done

    while [ $condition ]; do
        $statements
    done

    until [ $condition ]; do
        $statements
    done

    case $var in
        $first)
            $action ;;
        $second)
            $action ;;
        $third)
            $action ;;
        *)
            $action ;;
    esac

要点:
    1. 注意方括号里面的空格 !

핵심 함수
function $func() {

}

要点
    1. 返回值慎用
    2. 函数内的变量使用局部变量定义
    3. 括号内没有形参

function my_func() {
    local var1=value1

    echo "func name: $0"
    echo "first parameter: $1"
    echo "second parameter: $2"
    echo "all parameters: ${[@]}"
}

函数使用
    my_func $1 $2

규범 화 된 스 크 립 트 예시
    #!/usr/bin/env bash
    #
    # @date:      2016/11/11
    # @author:    he.zhiming
    # @license:   BSD
    #
    # Use BSD License
    #
    # Example shell script, for test.

    set -e
    PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
    export PATH

    var1="value1"
    var2="value2"
    arr1=( "val1" "val2" "val3" )

    if [ -e "${var1}" ] || [ -e "${var2}" ]; then
        echo "${var1}"
    elif [ -e "${var2}" ] && [-e "${var1}" ]; then
        echo "${var2}"
    else
        echo "nothing"
    fi

    for val in "${arr1[@]}"; then
        echo ${val}
    done

    while [ "" == "" ]; then
        echo "${var1} == ${var2}"
    done

    [[ -d "$dirname" ]] && cd $dirname && rm *                             # 这一句处处体现了 Shell 的防御式编程

좋 은 조수 를 청 하 다
셸 은 정말 약해 서 더 많은 신 에 게 도움 을 청 할 수 밖 에 없 었 다.
이때 shellcheck 등장 했다. Haskell 셸 스 크 립 트 를 전문 적 으로 검사 하고 규범 적 인 건 의 를 했다 고 한다.셸 체크 를 사용 하면 행복 감 이 폭 증 합 니 다!그것 은 마치 윗사람 처럼 항상 묵묵히 옆 에 있 고 귀 찮 지 않 게 당신 의 잘못 을 지적 하 며 성질 을 부리 지 않 습 니 다.
셸 체크 사용:
安装
    sudo apt-get install shellcheck
使用
    shellcheck $file.bash

좋은 웹페이지 즐겨찾기