V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
vision1900
V2EX  ›  Linux

如何流利的写 bash 脚本

  •  
  •   vision1900 · 320 天前 · 3160 次点击
    这是一个创建于 320 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近在写 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 条回复    2021-01-22 13:26:58 +08:00
    lostberryzz
        1
    lostberryzz  
       320 天前   ❤️ 1
    cat << EOF >> /etc/nginx/sites-aviailable/default
    server {
    ...
    }
    EOF

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