代码之家  ›  专栏  ›  技术社区  › 

从sh到Bash的替换和新实践是什么?

  •  1
  •  · 技术社区  · 7 年前

     Instead of             use 
    
     tmpfile=/tmp/me$$      tmpfile=`mktemp`
    
     [ ]                     [[ ]]
    

    5 回复  |  直到 17 年前
        1
  •  4
  •   Kent Fredric    17 年前

    尝一尝:

    • 忘记 [ 学 :

      • []中的未加引号的变量不会发生分词或路径名扩展。
      • 明白了:RHS of=被认为是一个全局模式:bar='I pinch';[[“我掐了”=$bar]#测试通过。
    • 对所有数字都使用(())。

    如。

    (( ++count ))
    (( $# )) || { echo "Expected an argument to the script." >&2; exit 1; }
    

    如。

    read filesize _ < <(wc -c myfile)
    openssl base64 <<< "Bar!" # as opposed to the more expensive: echo "Bar!" | openssl base64
    content=$(<file) # as opposed to the more expensive: content=$(cat file)
    

    如。

    rm "$(grep -l foo <<< "$(</my/file.list)")"
    
    • 数组,数组,数组。每当您需要保留多个字符串(如文件名!),请将它们保留在数组中。不要将它们保存在使用某种定界符分隔单独字符串的单个字符串中,这种方法总是有缺陷的。

    如。

    files=(/foo/*); for file in "${files[@]}"; do pinch "$file"; done
    

        2
  •  2
  •   Dan    17 年前

    这可能不是对你问题的直接回答,但我认为其中一些“陷阱”来自sh习惯:

    http://wooledge.org:8000/BashPitfalls

        3
  •  2
  •   mpez0    17 年前

    对于脚本编写,除非有特殊的原因,否则我将自己局限于Bourne构造。它们具有最大的可移植性,应该在使用bash、ksh甚至sh作为默认shell的系统上运行。

    如果您熟悉BourneShell语法,并且可以使用BourneShell使脚本实现您想要的功能,那么就不用担心扩展了。

        4
  •  2
  •   Jeff Thomas    17 年前

    而不是

    tmpfile=`mktemp`
    

    tmpfile=$(mktemp) 
    

    一般推荐做法(嵌套效果更好)

    我在bash4.0版本中也注意到了一些脚本中的这种情况。

    foo="$( some   
              multiline 
              command  in a string)"
    

    自4.0以来,我发现的问题是新行需要在中显式转义

    foo="$( some \ 
              multiline \
              command  in a string)"
    

    建议使用。

        5
  •  0
  •   dannysauer    17 年前

    添加到已存在的内容:

    现代贝壳中的弦操纵更好。对于老sh,您拥有 ${var##pattern} 和 ${var%%pattern} 构造函数,但使用bash和ksh93(以及其他不太常见的shell)可以得到执行字符串替换的操作符(如 ${var/source/replace}

    extglob正则表达式支持也相当方便,虽然并不完全是新的,但它通常未被老派shell程序员充分利用

    [[ "$str" = @(+([a-z])?([0-9])) ]]
    

    匹配所有字母数字或以一个数字结尾的字母数字字符串。在ksh88中,我一直在使用它。。。

    var=hello; hello=hi; echo $$var )以及大到足以实际使用的数组。数组是旧式shell开发人员经常未充分利用的另一种元素,部分原因是旧式shell中存在1024个元素的限制——现代shell至少支持4096个元素,并且大多数支持关联数组(perl称之为哈希)。

    推荐文章