在不使用 EOF 的情况下从 bash 脚本自动输入文本

And*_*rew 10 linux shell bash ubuntu shell-script

我正在运行 Ubuntu Linux。假设有一个名为 的程序myprogram。该程序提示用户输入;具体来说,用户必须在提示时输入一个整数并按Enter。我想使用 bash 脚本自动执行此过程。特别是,我想执行myprogram100 次(使用i1到的计数器100)。在每次执行 时myprogram,我想i在出现提示时输入 的当前值。

(顺便说一句,myprogram采用 options/switches -options,所有这些都将是常量,因此在 bash 脚本中指定。)

这个 bash 脚本的一个不完整的骨架可能是:

#!/bin/bash
for i in {1..100}
do
   myprogram -options
done
Run Code Online (Sandbox Code Playgroud)

现在我想修改上面的代码,以便i在程序提示时输入的当前值。做这个的最好方式是什么?

我正在使用的软件的网站建议<<EOF在行尾使用myprogram -options。我认为这告诉 bash 查看要使用的输入的“文件结尾”。但是,如果我不想要的东西放置在输入的结束文件?如果我想立即将它放在<<or 之后<怎么办?

原因是事情会变得更加复杂。例如,我可能会引入一个j以某种非线性、非顺序方式变化的整数计数器。然后,我想在每次迭代时提供jto的当前值myprogram,但 的值j可能会在调用到myprogram -options文件结束之间发生变化EOF

你有什么建议吗?

Kev*_*vin 14

对于几乎所有的节目,都echo $i | myprogram -optionsmyprogram -options <<<$i应该工作,通过喂食程序$i通过标准输入。

<foo将使用名为foostdin的文件的内容。

<<foo将使用该文本和仅包含foo作为标准输入的行之间的文本。正如吉尔斯所说,这是一份here 文件(heredoc);EOF实际上并不意味着文件的结尾,它只是一个常见的 heredoc 描述符(我们在这个例子中使用“foo”代替)。

<<<foo将使用字符串“foo”作为标准输入。您还可以指定一个变量$foo,shell 将使用其内容作为标准输入,如我上面所示。这称为herestring,因为它使用短字符串与整个块形成对比,如在 heredoc 中。Herestrings 在 bash 中工作,但在/bin/sh.


Gil*_*il' 9

本网站推荐的语法称为此处文档。文件程序的输入从包含 的行的正下方开始<<EOF,它不会在脚本结束时终止,而是由包含完全文本的行终止EOF(注意不要有多余的空格)。顺便说一句,您可以使用任何不包含任何 shell 特殊字符的结束标记:EOF不是关键字,它只是传统的。

#!/bin/bash
for i in {1..100}
do
   myprogram -options <<EOF
$i
EOF
   for j in {1..42}; do
     myprogram2 <<EOF
$i
$j
EOF
   done
done
Run Code Online (Sandbox Code Playgroud)