分页: 1 / 1

bash编程习惯。准确点。

发表于 : 2012-08-28 16:00
tusooa
  1. #!/bin/bash。在其他*nix上,可以#!/usr/bin/env bash。不要#!/bin/sh。有些人(谁?比如@chenfengyuan :em04 :em04 。)非要用(纯)POSIX的方式写shell。其实坑的是你自己。
  2. 见到$,就要加引号。特意要拆开的除外。不然如果里边有空格,很可能造成异常。如果里边有

    代码: 全选

    ()|<>&!#`\;
    就肯定会出问题了。 :em04
  3. 用"$()",不要"``"。``不方便嵌套。你想,要是只用``写3层获取输出,还不转义得累死 :em06 :em20

    代码: 全选

    `\`\\\`\\\`\``
    。$($($())),简单省事。

    代码: 全选

    ● sh -c '`\`\\\`echo echo echo echo echo\\\`\``'     
    echo
    
    虽然得到正确结果,而且移植性巨高。。。但是 :em06
  4. 在脚本里,不要alias。如果一定有需求,就function foo () { bar "$@"; }。alias可能不起作用。
  5. *NO* cat |grep, cat|sed, cat|awk。比效率,处理万行码就知道了。
    grep text file, sed -e expression file, awk 'script' file。
  6. bash自己能作的事情,尽量不要调用外部程序。正则除外(bash自己的似乎效率不高)。简单的比如${foo#bar}${foo%bar},就不要费劲sed了.
  7. 按行获取文件用while read line ; do something ; done <file。不要for i in `cat file`; do something ; done。如果文件一行内有空格,那这一行就会被拆成两次循环。
  8. 不要更改IFS。容易造成混乱。
  9. 数组,获取全部元素用"${foo[@]}"(有引号,注意括起来的是每个元素。不是整个数组。),不要

    代码: 全选

    ${foo[*]}
    。"$@"同理。添加元素可以考虑用foo+=(something)或者foo=("${foo[@]}" something)的形式。
欢迎补充。 :em01

全文循 知识共享 署名-相同方式共享。

Re: shell习惯

发表于 : 2012-08-28 16:10
lilydjwg
补充:能用 zsh 就不要用 bash,变量展开不会出问题(默认配置),正则应该也没什么问题。

真正的补充:sed 可以用 -e 指定多条命令,不用管道连接多个 sed。也不用 cat 文件给它。

Re: shell习惯

发表于 : 2012-08-28 16:17
tusooa
zsh那特性,光适合interactive把。没用过写脚本。

Re: shell习惯

发表于 : 2012-08-28 17:27
lilydjwg
tusooa 写了:zsh那特性,光适合interactive把。没用过写脚本。
补全是只适合交互,globbing 呢?全部目录 *(/),全部可执行文件 *(*),递归子目录的所有 C 文件 **/*.c,除了 .o 文件 ^*.o,C 代码,但 test 开头的例外 *.c~test_*。
字符串操作、数组和关联数组什么的我也不太明白,就不说了。不过 zsh 有 pty 和 tcp、ftp 等的模块哦。

Re: shell习惯

发表于 : 2012-08-28 19:15
枫叶饭团
好吧,除了第一条,其它我都在干 :em34

Re: shell习惯

发表于 : 2012-08-28 20:21
eexpress
自动化,比交互式,高一个层次。

这帖子,算总结,还是碎碎念。

Re: shell习惯

发表于 : 2012-08-28 20:42
tusooa
lilydjwg 写了:
tusooa 写了:zsh那特性,光适合interactive把。没用过写脚本。
补全是只适合交互,globbing 呢?全部目录 *(/),全部可执行文件 *(*),递归子目录的所有 C 文件 **/*.c,除了 .o 文件 ^*.o,C 代码,但 test 开头的例外 *.c~test_*。
字符串操作、数组和关联数组什么的我也不太明白,就不说了。不过 zsh 有 pty 和 tcp、ftp 等的模块哦。
hash,bash倒是有。而且吾还专门给写了个shell module.

Re: shell习惯

发表于 : 2012-08-28 20:45
tusooa
枫叶饭团 写了:好吧,除了第一条,其它我都在干 :em34
是说你只是#!/bin/sh #???

Re: shell习惯

发表于 : 2012-08-28 21:54
枫叶饭团
tusooa 写了:
枫叶饭团 写了:好吧,除了第一条,其它我都在干 :em34
是说你只是#!/bin/sh #???
擦,不小心说反了

Re: shell习惯

发表于 : 2012-08-28 23:02
Methuselar
tusooa 写了:zsh那特性,光适合interactive把。没用过写脚本。
zsh解释脚本恰恰有ksh的遗风,比bash合适的多... POSIX风格也没什么不妥。

bash还是留给linux root自己玩吧

Re: shell习惯

发表于 : 2012-08-28 23:09
tusooa
Methuselar 写了:
tusooa 写了:zsh那特性,光适合interactive把。没用过写脚本。
zsh解释脚本恰恰有ksh的遗风,比bash合适的多... POSIX风格也没什么不妥。

bash还是留给linux root自己玩吧
吾说的是。纯POSIX太累人了。

Re: bash编程习惯。准确点。

发表于 : 2012-08-30 0:30
naturalaw
关于``,我认为也不完全这样。
``在一次使用的时候还是不错的。只要打两个字符,维护成本=没有。

Re: bash编程习惯。准确点。

发表于 : 2012-08-30 7:42
自由建客
爱怎么写怎么写,反正我是这样的。