为什么换行符会扰乱我的 while 条件?

为什么换行符会扰乱我的 while 条件?

我有一个 while 循环,允许在以一种方式编写时设置变量,但在以另一种方式编写时不允许设置变量。这是为什么?这将 var 打印为 1234 并且不打印 var2

#!/bin/bash

var=1234

while var=9876 var2=765 read line
do

    echo $var $var2
    echo $line

done <datafile

echo out of loop $var

这将 var 打印为 9876 并打印 var2

#!/bin/bash

var=1234

while 
var=9876 
var2=765 
read line
do

    echo $var $var2
    echo $line

done <datafile

echo out of loop $var

答案1

在第二个示例中,通过将 var 和 var2 放在不同的行上,这使得命令与

while var=9876; var2=765; read line

while命令允许在执行 do--while 循环中的命令之前显示命令列表。   help while显示这个:

while:同时命令;执行命令; done
  只要测试成功就执行命令。
  只要
  `while' COMMANDS 中的最后一个命令的退出状态为零,就展开并执行 COMMANDS。
  退出状态:返回最后执行的命令的状态。

另一方面,当变量赋值在命令之前(在本例中read),并且该赋值后面仅跟有空格时,该变量的作用域仅是命令的本地范围! (内部)...

看:  在'while IFS= read..'中,为什么IFS没有效果?

答案2

我不知道 bash 可以做这些事情,所以感谢您发布它们。

这是我的解释。

第一个脚本中的这一行:

while var=9876 var2=765 read line 

实际上将名为“var”的环境变量设置为值“9876”,并将另一个名为“var2”的环境变量设置为值“765”但仅限于命令read line。这是一个奇怪的老式外壳“功能”。这就是为什么该行echo $var $var2只打印出“1234” - 名为“var”的环境变量仅适用于read line.

第二个脚本中,变量赋值和出现read line在不同的行上,我认为每次循环都会分配名为“var”和“var2”的 shell 变量。

相关内容