如何使用bash和read将命令输出分配给变量
如何使用bash和read将命令输出分配给变量
在bash中,我们经常需要将命令的输出结果分配给变量。这样我们就可以在后续的脚本中使用这些变量来执行其他操作。但是,有时我们可能会遇到一些问题,特别是当我们想要将多个值分配给多个变量时。在这篇文章中,我们将讨论这个问题的原因以及解决方法。
问题的原因:
当我们执行一个命令,并尝试将其输出结果分配给多个变量时,我们可能会遇到一些困难。例如,考虑以下代码片段:
read a b c <<< "$( echo 1 2 3 )" # a here-string
我们期望将命令`echo 1 2 3`的输出结果分配给变量`a`、`b`和`c`。然而,这段代码并不能按我们的期望工作。
解决方法:
为了解决这个问题,我们可以使用`while`循环结合`read`命令来逐行读取命令的输出,并将每一行的内容分配给相应的变量。以下是修复上述问题的代码示例:
echo 1 2 3 | while read a b c; do echo "a: $a, b: $b, c: $c" done
在这个示例中,我们使用`echo 1 2 3`命令将输出结果传递给`while`循环。然后,`read`命令将每一行的内容分配给变量`a`、`b`和`c`。接下来,我们可以在循环体内使用这些变量来执行其他操作。
通过使用`while`循环和`read`命令,我们可以解决将命令输出分配给多个变量的问题。这种方法适用于需要将多个值分配给多个变量的情况。希望本文对你理解如何在bash中将命令输出分配给变量有所帮助。
在bash中,使用管道将命令的输出赋值给变量时会遇到问题。原因是管道创建了一个子shell,在子shell中变量FOO、BAR和BAZ被赋值,而在父shell中没有被赋值,所以打印不出任何结果。
解决方法是使用大括号将命令包裹起来,让echo命令在同一个子shell中运行,这样变量就能正确赋值并打印出正确结果。
另一种解决方法是使用进程替换,将echo命令的输出通过重定向赋值给变量。这样整个过程都在同一个shell中进行,所以能够正常打印出预期的结果。
下面是修改后的代码示例:
echo foo bar baz | { read FOO BAR BAZ ; echo $FOO $BAR $BAZ ;}
read FOO BAR BAZ < <(echo foo bar barz) echo $FOO $BAR $BAZ
通过以上的修改,可以正确将命令的输出赋值给变量,并打印出正确的结果。