作为一个在 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/