技术

Zsh和Bash的兼容性问题

兼容

Zsh在大部分时候是兼容Bash, 是的“大部分时候”

Loop

如果在loop里使用了数组,那么脚本在Bash里可以工作,而在Zsh里则不行

words=("first" "second" "third")
for((i=0; i < ${#words}; i++))
do 
  echo ${words[$i]}
done

有两个地方破坏了兼容性:

  • 在for后面应该加一个空格

  • Bash的数组是从0开始的,而Zsh里是从1开始的

words=(“ ” "first" "second" "third")
for((i=1; i < ${#words}; i++))
do 
echo ${words[$i]}
done

Wildchar

less */textfile是两种shell里都可以工作,但locate */vi只能在Bash里工作。
Zsh会报zsh:no matches found: */vi。解决方案是使用双引号:

locate "*/vi"

short if statement

这种if语句如下

[ "1" == "1" ] echo "Yes, both are the same.";

Bash里工作正常,但Zsh会有zsh: = not found的错误。 为了兼容只能使用一个“=”。

在任何时候都建议使用完整的if语句, 比如

if [ "$project_description" = "" ];
then
    echo "You must provide a project description!"
    exit
fi

总结

  1. 注意空格和引号

  2. 注意数组index的不同

  3. 使用一个行号,避免使用短的if语句

原文链接

该文章由WP-AutoPost插件自动采集发布

原文地址:https://segmentfault.com/a/1190000011122024

Follow me!

发表评论

电子邮件地址不会被公开。 必填项已用*标注