我有一个 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
),并且该赋值后面仅跟有空格时,该变量的作用域仅是命令的本地范围! (内部)...
答案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 变量。