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

猛击数组未退出失效[重复]

  •  0
  • ShkiperDesna  · 技术社区  · 6 年前

    Bash允许使用: cat <(echo "$FILECONTENT")

    Bash还允许使用: while read i; do echo $i; done </etc/passwd

    要结合前两种方法,可以使用: echo $FILECONTENT | while read i; do echo $i; done

    最后一个的问题是,它创建了子shell,并且在while循环结束变量之后 i 无法再访问。

    我的问题是:

    如何实现这样的目标: while read i; do echo $i; done <(echo "$FILECONTENT") 或者换言之:我怎么能确定 在循环中生存?

    请注意,我知道将while语句 {} 但这并不能解决问题(假设您希望使用while循环in函数并返回 变量)

    0 回复  |  直到 9 年前
        1
  •  136
  •   Community Mohan Dere    6 年前

    正确的符号 Process Substitution 是:

    while read i; do echo $i; done < <(echo "$FILECONTENT")
    

    的最后一个值 i 然后,当循环终止时,在循环中指定的值可用。 另一种选择是:

    echo $FILECONTENT | 
    {
    while read i; do echo $i; done
    ...do other things using $i here...
    }
    

    大括号是一个I/O分组操作,本身并不创建子shell。在这种情况下,它们是管道的一部分,因此作为子shell运行,但这是因为 | ,而不是 { ... } .你在问题中提到了这一点。好了,您可以在函数中从这些函数中进行返回。


    Bash还提供 shopt 内置和众多选项之一是:

    lastpipe

    如果已设置,并且作业控制未处于活动状态,则shell将运行当前shell环境中未在后台执行的管道的最后一个命令。

    因此,使用这样的东西 在脚本中 使修改后的 sum 循环后可用:

    FILECONTENT="12 Name
    13 Number
    14 Information"
    shopt -s lastpipe   # Comment this out to see the alternative behaviour
    sum=0
    echo "$FILECONTENT" |
    while read number name; do ((sum+=$number)); done
    echo $sum
    

    在命令行中执行此操作通常会违反“作业控制未激活”(即在命令行中,作业控制处于激活状态)。在不使用脚本的情况下对此进行测试失败。

    此外,正如 Gareth Rees 在his中 answer ,您有时可以使用 here string :

    while read i; do echo $i; done <<< "$FILECONTENT"
    

    这不需要 shopt公司 ;您可以使用它保存进程。

        2
  •  29
  •   Community Mohan Dere    9 年前

    Jonathan Leffler explains 如何使用 process substitution ,但另一种可能性是使用 here string :

    while read i; do echo "$i"; done <<<"$FILECONTENT"
    

    这将保存一个进程。

        3
  •  1
  •   Steve    6 年前

    此函数用于复制jpg文件的$NUM次(bash)

    function makeDups() {
    NUM=$1
    echo "Making $1 duplicates for $(ls -1 *.jpg|wc -l) files"
    ls -1 *.jpg|sort|while read f
    do
      COUNT=0
      while [ "$COUNT" -le "$NUM" ]
      do
        cp $f ${f//sm/${COUNT}sm}
        ((COUNT++))
      done
    done
    }