• 一些shell编程技巧


    最近要重新开始搞数据了,把之前写的shell脚本重新梳理了一下,有这么几个改进的地方,能够提升一些工作效率。

    很多思想都是来自github上的命令行的艺术

    1 Use Bash Strict Mode (Unless You Love Debugging)

    这篇文章所写的全都是我的知识盲区,解答了我最近遇到的很多shell环境问题。比如为什么在脚本中source新的python环境会出错,为什么很多别人写的脚本前面都要加set -euo pipefail IFS=$'\n\t',以前都没有认真思考过。

    脚本前面加上如下内容,可以最大程度减少bug。

    #!/bin/bash 
    set -euo pipefail 
    IFS=$'\n\t'
    
    • 1
    • 2
    • 3

    set -e

    如果任何命令返回为非零,则bash 立即退出。如果没有这条命令,那么当前命令失败后,后面的指令还是会执行,这会带来意想不到的bug。

    set -u

    设置后对未定义的任何变量的使用(除了 $* 和 $@)都会报错,程序立即退出。

    set -o

    如果管道中的任何命令失败,该返回代码将用作整个管道的返回代码。

    IFS=$‘\n\t’

    bash的默认分隔符是空格、换行、Tab,遍历含有空格的字符串时,会以空格为分隔符,单着常常不是我们想要的。IFS=$'\n\t’的作用就是只设置换行和Tab作为分隔符。

    当然这样设置也会遇到一些问题(比如source新的python环境,血泪教训),作者在文章里也写明了他遇到的所有问题的解决方法。

    2 命令行参数选择(getopts) 参考链接

    核心需求有两个:

    1. 命令行参数控制执行哪些参数
    2. 函数化,以方便命令行参数调用

    代码如下,调用方式为 ./test.sh -c my_config -p

    # test.sh
    #!/bin/bash 
    set -euo pipefail 
    IFS=$'\n\t'
    
    function print_something()
    {
    }
    
    CONFIG=""
    USAGE_MESSAGE="help msg"
    while getopts "c:ph" opt; do #选项后面有冒号表示该选项需要参数
      case ${opt} in
        c) CONFIG=$OPTARG #参数存在$OPTARG中
        ;;
        p) print_something
        ;;
        h) echo $USAGE_MESSAGE
        exit 0
        ;;
        \?) echo "Invalid option -$OPTARG" >&2 #当有不认识的选项的时候arg为?
        echo $USAGE_MESSAGE
        exit -1
        ;;
      esac
    done   
    
    if [ -z "$CONFIG" ]; then # 如果CONFIG为空,表示-c这个参数没有设置过,  -z:空,-n:非空
      CONFIG="default config"
    fi
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    3 使用子 shell((command))

    这个操作非常使用,因为子shell在退出时环境就自动恢复了。两个很有用的场景:临时切换目录和临时切换环境

    # do something in current dir
    (cd /some/other/dir && other-command)
    (source /some/env && process-command)
    # continue in original dir
    
    • 1
    • 2
    • 3
    • 4

    4 其他

    1. shell变量的作用域

    2. Python 如何优雅的调用 Shell pip install sh

    3. 使用shellcheck做shell语法检查 https://github.com/koalaman/shellcheck

    4. How to do it Correctly里的一些建议,对如何处理文件名含特殊字符的文件,以及通配符、find的一些用法建议。如对变量和命令使用双引号
      在这里插入图片描述

    共勉!

  • 相关阅读:
    数据结构——优先级队列(堆)
    MLC-LLM 部署RWKV World系列模型实战(3B模型Mac M2解码可达26tokens/s)
    ASEMI整流桥KBJ410参数,KBJ410压降,KBJ410热阻
    Docker
    移动app安全检测报告有什么作用?
    Linux基本指令1
    论文阅读:AugGAN: Cross Domain Adaptation with GAN-based Data Augmentation
    计算机毕业设计选题推荐-船运物流管理系统-Java项目实战
    【JavaSE】/*Java运算符详解*/
    Google Earth Engine(GEE)——单景影像导出到Google 硬盘中
  • 原文地址:https://blog.csdn.net/u012686154/article/details/125904622