V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
vision1900
V2EX  ›  Linux

如何流利的写 bash 脚本

  •  
  •   vision1900 · Jan 20, 2021 · 4745 views
    This topic created in 1934 days ago, the information mentioned may be changed or developed.

    最近在写 bash 脚步进行一些自动化, 新手,中间需要把 Nginx 配置写到 /etc/nginx/sites-aviailable/default 里面。由于配置是带换行和缩进的,我又不想把配置放到另外一个文件,于是就开始摸索如何在 bash 里面表示多行文本。

    1. 一开始手动向文本中插入 \n 和 \t, 想着用 echo -e 然后 pipe 就能用了
    2. 后来发现手动太麻烦了,配置一多根本没法 scale, 于是开始找能打印出 \n 和 \t 这些不可见字符的方法
    3. 没找到,决定自己写,思路是先把文本转为 hex, 把换行的 hex 替换为 "\" 和 “n” 的 hex, 把制表符的 hex 换为 "\" 和 "t" 的 hex,然后把 hex 文本转回为 ASCII 字符。
    

    第 3 步了解到了 hexdump 和 xxd, 这是代码:

    # to use hexdump, bsdmainutils must be installed
    yes Y | apt install bsdmainutils xxd > /dev/null 2>&1 
    
    # newline ascii hex code: 0a
    # tab ascii hex code: 09
    
    # backslash ascii hex code: 5c
    # n ascii hex code: 6e
    # t ascii hex code: 74
    
    hexdump -e '16/1 "%02x " "\n"' $1 | sed 's/0a/5c6e/g' | sed 's/09/5c74/g' | xxd -r -p
    

    后来偶然发现有一种叫 heredoc 的东西,可以在脚本中直接表示格式化文本,当场傻了

    请问如何避免绕弯路,能流利自信的写 bash 脚本呢?

    此外,我之前了解到 explainshell.com 和 shellcheck 这两个工具,感觉有和没有简直是天上地下。各位如果有这种超好用的工具,也希望能推荐下

    17 replies    2021-01-22 13:26:58 +08:00
    lostberryzz
        1
    lostberryzz  
       Jan 20, 2021   ❤️ 1
    cat << EOF >> /etc/nginx/sites-aviailable/default
    server {
    ...
    }
    EOF

    正常不是这样写的吗。。
    fzinfz
        2
    fzinfz  
       Jan 20, 2021
    不要偶然发现,时刻记住有个东西叫“搜索引擎”,比如:
    https://www.google.com/search?q=bash+echo+multi+lines
    vision1900
        3
    vision1900  
    OP
       Jan 20, 2021
    @lostberryzz 是的,我后来才知道 heredoc 这种东西。如何在一开始就能对这些基础设施有了解呢?大佬有什么书或者资料推荐吗
    vision1900
        4
    vision1900  
    OP
       Jan 20, 2021
    @fzinfz 我确实不善于搜索,很容易陷入长篇大论的解释中去。最近才了解到 Grepper 这个插件,相见恨晚
    lostberryzz
        5
    lostberryzz  
       Jan 20, 2021
    不是大佬,我也是遇到需求搜 google 发现的,碰到一两次就记得了,还有网上的各种一键脚本也可以看看,观摩下写法
    ch2
        6
    ch2  
       Jan 21, 2021
    直到我用了 python,就再也不写 shell 了
    Lonenso
        7
    Lonenso  
       Jan 21, 2021 via Android
    写多了就懂了。因为你写的不是错的,只是你觉得不够好。
    aloxaf
        8
    aloxaf  
       Jan 21, 2021
    你这个问题和 bash 没有任何关系——不去读文档也不去看教程,光凭感觉来学习一门语言都是这个下场
    itabas016
        9
    itabas016  
       Jan 21, 2021 via Android
    老铁,你这已经不是新手水平了
    omph
        10
    omph  
       Jan 21, 2021
    Ansible 自动化运维
    goodryb
        11
    goodryb  
       Jan 21, 2021
    善用搜索引擎,入门的东西网上信息很多,多看看别人是怎么写的
    wikinee
        12
    wikinee  
       Jan 21, 2021
    先闭着眼写出达到目的的功能,再用 shellcheck 完成优化。
    d0m2o08
        13
    d0m2o08  
       Jan 21, 2021
    现在不都是 yaml 工程师了么啊🤣
    qwerthhusn
        14
    qwerthhusn  
       Jan 21, 2021
    熟能生巧
    dangyuluo
        15
    dangyuluo  
       Jan 21, 2021 via iPhone
    先读一遍 advanced bash
    nthhdy
        16
    nthhdy  
       Jan 21, 2021
    和 python ruby 等语言比较一下,体会一下它的可读性、原语丰富程度。
    我的选择是,不碰 shell,除非
    1. 3 行以内搞定
    2. 仅仅是把命令串起来(不涉及分支、循环、表达式等逻辑)
    3. 简单内嵌到其它配置里(比如 makefile )
    4. 别人写的必须维护
    ophark
        17
    ophark  
       Jan 22, 2021
    man bash
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3085 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 79ms · UTC 11:05 · PVG 19:05 · LAX 04:05 · JFK 07:05
    ♥ Do have faith in what you're doing.