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

如何流利的写 bash 脚本

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

    最近在写 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     Solana     1261 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 17:25 PVG 01:25 LAX 09:25 JFK 12:25
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86