如何在 while 循环中“读取”变量

Posted

技术标签:

【中文标题】如何在 while 循环中“读取”变量【英文标题】:How do I "read" a variable on a while loop 【发布时间】: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

【问题讨论】:

【参考方案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提出的答案被提问者接受。这意味着问题与脚本的文件格式有关。

以上是关于如何在 while 循环中“读取”变量的主要内容,如果未能解决你的问题,请参考以下文章

如何在while循环中读取带有空格的字符串(Java)

如何在 while 循环中使用 .nextInt() 和 hasNextInt()

如何在 SQL Server 的 While 循环中设置变量

如何在单页中使用 php 从 while 循环中生成多个读取更多按钮?

如何在while循环中返回?

如何使用定时全局变量影响 bash while 循环?