【问题标题】:How do I "read" a variable on a while loop如何在 while 循环中“读取”变量
【发布时间】:2012-10-18 19:34:17
【问题描述】:

如何使用while read line 读取变量?

例如:

the_list=$(..code..)

while read line
do
        echo $line

done < $the_list

使用上面的代码给我错误:

./copy.sh: line 25: $the_list: ambiguous redirect

【问题讨论】:

    标签: bash variables while-loop


    【解决方案1】:

    你可以写:

    while IFS= read -r line
    do
        echo "$line"
    done <<< "$the_list"
    

    §3.6.7 "Here Strings" in the Bash Reference Manual

    (我还冒昧地添加了一些双引号,并将-rIFS= 添加到read,以避免过多地混淆变量的内容。)

    【讨论】:

    • IFS= 是否将 IFS 设置为空字符?为什么在这种情况下需要它?
    • @doubleDown: IFS=$IFS 设置为空字符串(因此它根本不包含任何字符)。在这种情况下,由于只有一个字段,其唯一作用是防止从行首删除前导 IFS 字符。 (要明白我的意思,比较 read foo &lt;&lt;&lt; ' bar' ; echo "$foo"IFS= read foo &lt;&lt;&lt; ' bar' ; echo "$foo"。)
    【解决方案2】:

    如果你不将变量用于其他任何事情,你甚至可以不使用它:

    while read line ; do
        echo $line
    done < <( ... code ... )
    

    【讨论】:

      【解决方案3】:

      你可以使用

      your_code | while read line;
      do
          echo $line
      done
      

      如果您不介意在子 shell 中执行 while 循环(您修改的任何变量在 done 之后的父级中都不可见)。

      【讨论】:

      • 这是一个旧回复。我对“...(您修改的任何变量在完成后在父级中不可见)感兴趣。”声明的一部分。那么它们将如何可见?例如,以下示例 echo "${NAMES/,/$'\n'}" |while read -r NAME ;do TMP=${NAME#*_} ;TMP2=${TMP%_*_*_*_*_*} ;OUTPUT+=${TMP2/$'\n'/,} ;done 在循环后不会返回带有 echo $OUTPUT 的任何内容。
      • 他们不会,正如我所说的。您正在不同的过程中创建和/或修改变量。但是,变量并不是唯一的输出形式:循环仍然可以将输出直接打印到共享标准输出(事实上,这个示例就是这样做的),并且它仍然可以对子 shell 退出后仍然存在的文件进行操作。
      • 谢谢(再次)!以下稍微详细的示例完全符合我的需要:-):通过while read -r NAME; do TMP=${NAME#*_} ;TMP2="${TMP%_*_*_*_*_*}" ;if [ -z $OUTPUT ] ;then OUTPUT+=${TMP2:-$TMP2} ;else OUTPUT+=${OUTPUT:+,$TMP2} ;fi ;done &lt;&lt;&lt; ${NAMES//,/$'\n'*}循环NAMES=x_myd11a1_lst_night_2019_01_01T01_30_00,x_myd21a1_lst_night_2019_01_01T01_30_00派生OUTPUT变量echo $OUTPUTmyd11a1_lst_night,myd21a1_lst_night
      【解决方案4】:

      脚本文件应处于 Linux 模式。以前它处于dos模式。我使用dos2unix filename 更改了它。

      例如:

      dos2unix sshcopy.sh
      

      现在它对我有用。

      【讨论】:

      • ruakh提出的答案被提问者接受。这意味着问题与脚本的文件格式有关。
      猜你喜欢
      • 2014-11-13
      • 1970-01-01
      • 2021-05-22
      • 2010-12-04
      • 1970-01-01
      • 2011-11-10
      • 1970-01-01
      • 2019-03-23
      • 1970-01-01
      相关资源
      最近更新 更多