bash:可以读取用作命令或表达式吗?

时间:2013-04-24 05:48:42

标签: bash shell unix zsh

我想创建一个oneliner循环来读取和检查它读取的内容。

这肯定行不通:

while [[ read line != "q" ]]; do; echo "enter q to quit: "; done

这里的Zsh告诉我condition expected: read

也许read甚至没有这个返回值的概念。

2 个答案:

答案 0 :(得分:2)

Bash Pitfall #9

  

如果接受命令。 [是一个命令,而不是if语句的语法标记。它等同于test命令,但最终参数必须是]。

[[不是if条件的特殊语法。 [[本身就是一个命令。尝试这样的循环:

while read -r line; do
  [[ $line = "q" ]] && break
  # more code
done

read在无法读取表达式时返回失败,[[是一个命令,因此可行。有关详细信息,请参阅http://mywiki.wooledge.org/BashFAQ/001

注意:将-r切换为read是一个好主意 - 它会阻止输入中出现反斜杠的有趣事情。

答案 1 :(得分:-1)

while read line; do; [[ "$line" == 'q' ]] && break; done;

似乎有效。

但我不确定为什么我无法用[[ ]]替换[ ],它奇怪地失败了:

$ bash
bash-3.2$ while true; do; read line; [ "$line" == 'q' ] && break; done;
bash: syntax error near unexpected token ';'                                       

$ while true; do; read line; [ "$line" == 'q' ] && break; done;
ajlfkj
zsh: = not found