正确使用 IO 重定向将用户输入附加到 linux 脚本中的文件?

properly using IO redirection to append user input to a file in linux scripting?

我刚开始学习 linux 脚本,和他们一起学习 output/inputs。我需要学习并一直尝试做但无济于事的一件事是将用户输入附加到文件输出。像

阅读文字 > text.dat

阅读文字 $文本 > text.dat

通常以失败告终,或者创建 text.dat 无论用户输入什么,它最终都是空的。我错过了什么?

manual file 中所述,读取命令将获取一行用户输入并将其分配给一个变量,您可以将该变量命名为参数。如果您传递多个名称,它还会拆分用户输入并将其分配给多个变量。它将在后台执行所有这些操作,而不会向标准输出打印任何类型的确认信息。我们还知道 > 运算符会将命令的标准重定向到文件描述符。同样重要的是要注意,除非 bash 被明确告知一行包含多个命令(通过使用分号或类似的方式),否则它将假定它是一个带有多个参数的命令。

所以让我们看一下您的示例,看看发生了什么:

read text > text.dat

这将 运行 读取命令,它将用户输入静默分配给名为 $text 的变量。然后它将命令的输出(没有任何内容,因为它是无声的)重定向到一个名为 text.dat 的文件。最终结果:一个空 text.dat 和一个未使用的 $text 变量。

read text $text > text.dat

Bash 将解析此命令并首先尝试获取分配给 $text 变量的值,此时它是未定义的,因此将被忽略。因此它将 运行 读取命令,它会默默地将用户输入分配给一个名为 $text 的变量。然后它将命令的输出(没有任何内容,因为它是无声的)重定向到一个名为 text.dat 的文件。最终结果:一个空 text.dat 和一个未使用的 $text 变量。

那么我们该如何解决呢?第一个命令很好,我们使用 read text 允许用户输入一行并将该行分配给一个名为 $text 的变量。然后,我们需要一种方法将该变量发送到标准输出,以便我们可以重定向它。为此,我们可以使用 echo 命令,我们可以重定向它。

例如:

read text
echo $text > text.dat

另一件需要注意的事情是 > 运算符将覆盖文件,要追加到它,您可以使用 >> 运算符。

所以要获取用户输入并将其附加到文件中,我们有:

read text
echo $text >> text.dat