bash - 从 sh 到 Bash 有哪些替代和新做法?

标签 bash unix shell

作为一个在 20 年前编写了大量 sh 脚本的人,现在又重新开始,我发现我使用的技术被认为是过时的。我应该花时间阅读“新消息”,但我没有。而且效率不是很高。示例:

 Instead of             use 

 tmpfile=/tmp/me$$      tmpfile=`mktemp`

 [ ]                     [[ ]]

将原始 Bourne shell 与 BASH 进行比较,您认为有哪些重要变化?

最佳答案

尝一尝:

  • 忘记[,学习[[:

    • [[] 中未加引号的变量不会发生分词或路径名扩展。
    • 您可以使用 = 进行 glob 模式匹配:[[ $foo = *.txt ]](foo 以 .txt 结尾)
    • 你可以使用=~来进行ereg模式匹配:ereg='.*.txt'; [[ $foo =~ $ereg ]]
    • 您可以使用 &&、||和 ( ) 在测试中:[[ $bar && ( $foo = *.txt || $foo = *.bar ) ]]
    • 陷阱:= 的 RHS 被认为是一个 glob 模式:bar='I pinch??'; [[ "I pinched"= $bar ]] # 测试通过。
  • 对所有数字使用 (( ))。

例如。

(( ++count ))
(( $# )) || { echo "Expected an argument to the script." >&2; exit 1; }
  • 一些可爱的 IO 运算符,例如 <()、<<< 等。

例如。

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

有关更多信息,请查看以下位置。它们可能是最有用和最值得信赖的 Bash 资源:

关于bash - 从 sh 到 Bash 有哪些替代和新做法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/690868/

相关文章:

linux - zip 在终端中有效,但在脚本内无效?

bash - 如何使用 bash 或 curl 将数据 urlencode 到 URL

linux - 使用 find 命令查找文件修改时间

linux - Cat 命令给出 "No such file or directory"

UNIX 中的 java.lang.NoClassDefFoundError

linux - 如何检查变量是否包含有效的 ip 地址

linux - 如何在 "sed"命令中输入数学表达式?

python - 使用python的调度程序

linux - 在 shell 脚本中发送包含多个文件的邮件

linux - 重命名文件夹中的部分多个文件