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

如何流利的写 bash 脚本

  •  
  •   vision1900 · 2021-01-20 23:40:45 +08:00 · 3959 次点击
    这是一个创建于 1401 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近在写 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  
       2021-01-20 23:48:42 +08:00   ❤️ 1
    cat << EOF >> /etc/nginx/sites-aviailable/default
    server {
    ...
    }
    EOF

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