BASH和CSH上的变量值不一致

时间:2009-04-08 08:52:21

标签: shell

愿上帝永远不会让你在Solaris上工作的祸根。 现在,我正在尝试运行这个简单的shell脚本:

#!/bin/sh

input="a
b
c"
data="123"

while read eachline
do      
   data="$data$eachline"
done <<  EOF
$(echo "$input")
EOF

echo "$data"
exit 0

在RHEL(BASH)上我按预期接收输出,即“123abc”,但是,在Solaris上我只收到“123”。

经过一段时间的谷歌搜索,我意识到Solaris正在为while循环中的代码分配进程,因此变量的($ data)值不会反映在while循环的外部。

任何希望在两个平台上兼容此代码的人都将非常感激。

哦,是的,使用临时文件进行重定向不是一个非常优雅的解决方案:|

5 个答案:

答案 0 :(得分:2)

Solaris盒子上有bash可执行文件吗?我注意到你指的是RHEL上的bash,但你的shell设置为#!/ bin / sh(即vanilla Bourne shell)。

答案 1 :(得分:0)

您的脚本在Mac OS X 10.5上运行正常,该版本已通过Single Unix Specification version 3认证。

Solaris上/ bin / sh中while的行为非常奇怪。您能提供找到分叉问题的链接吗?

可能的解决方案可能是使用另一个shell,例如/ bin / ksh。


修改

您的链接提供的示例不会显示while的问题,而是任何shell的正常行为。所有这些的基本结构是:

first_command | second_command_updating_variable

second_command_updating_variablewhile循环的事实并不重要。重要的是管道的第二个命令在子shell中执行,不能修改其父shell的变量。

答案 2 :(得分:0)

这个怎么样(请注意反推):

#!/bin/sh

input="a
b
c"
data="123"

z=`while read eachline
do      
   data="$data$eachline"
done <<  EOF
$(echo "$input")
EOF
echo $data
`
echo $z
exit 0

答案 3 :(得分:0)

下面这段代码解决了我的问题。我想这里的关键是在子shell和ofcourse中回显变量,而不是使用“here”文档。

我已经在CSH / BASH / KSH上测试了这段代码。

#!/bin/sh
input="a
b
c"

printf "$input" | { 
data="123"
while read eachline
do      
    data="$data$eachline"
done 
echo "$data"
}

exit 0

衷心感谢参与讨论的所有人。

答案 4 :(得分:0)

为什么在这里的文件中执行subshell

while read eachline
do      
   data="$data$eachline"
done <<  EOF
$(echo "$input")
EOF

你可以插入:

while read eachline
do      
   data="$data$eachline"
done <<  EOF
$input
EOF

或回声:

echo "$input" | while read eachline
do      
   data="$data$eachline"
done

实际上,当我测试这些时,他们都在Solaris上工作对我来说很好,所以我不确定你为什么遇到麻烦。