代码之家  ›  专栏  ›  技术社区  ›  pavanlimo

BASH和CSH上的变量值不一致

  •  2
  • pavanlimo  · 技术社区  · 17 年前

    愿上帝永远不会给你在索拉里斯工作的痛苦。 现在,我试图运行这个简单的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
    

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

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

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

    5 回复  |  直到 17 年前
        1
  •  2
  •   Brian Agnew    17 年前

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

        2
  •  0
  •   anon anon    17 年前

    这个怎么样(请注意回溯):

    #!/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
  •   mouviciel    17 年前

    您的脚本在经过认证的Mac OS X 10.5上运行良好 Single Unix Specification version 3 .

    Solaris上while in/bin/sh的行为非常奇怪。你能提供你发现分叉问题的链接吗?

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


    编辑

    您的链接提供的示例没有显示问题 while 但这是任何外壳的正常行为。它们的基本构造是:

    first_command | second_command_updating_variable
    

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

        4
  •  0
  •   pavanlimo    17 年前

    下面的代码解决了我的问题。我想这里的关键是从子shell中回显变量,当然,不要使用“这里”文档。

    我已经在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
    

    我衷心感谢所有参加这次讨论的人。

        5
  •  0
  •   Brian Campbell Dennis Williamson    17 年前

    为什么执行a 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上运行得很好,所以我不知道你为什么会遇到问题。