And*_*rew 10 linux shell bash ubuntu shell-script
我正在运行 Ubuntu Linux。假设有一个名为 的程序myprogram
。该程序提示用户输入;具体来说,用户必须在提示时输入一个整数并按Enter。我想使用 bash 脚本自动执行此过程。特别是,我想执行myprogram
100 次(使用i
从1
到的计数器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
以某种非线性、非顺序方式变化的整数计数器。然后,我想在每次迭代时提供j
to的当前值myprogram
,但 的值j
可能会在调用到myprogram -options
文件结束之间发生变化EOF
。
你有什么建议吗?
Kev*_*vin 14
对于几乎所有的节目,都echo $i | myprogram -options
和myprogram -options <<<$i
应该工作,通过喂食程序$i
通过标准输入。
<foo
将使用名为foo
stdin的文件的内容。
<<foo
将使用该文本和仅包含foo
作为标准输入的行之间的文本。正如吉尔斯所说,这是一份here 文件(heredoc);EOF
实际上并不意味着文件的结尾,它只是一个常见的 heredoc 描述符(我们在这个例子中使用“foo”代替)。
<<<foo
将使用字符串“foo”作为标准输入。您还可以指定一个变量$foo
,shell 将使用其内容作为标准输入,如我上面所示。这称为herestring,因为它使用短字符串与整个块形成对比,如在 heredoc 中。Herestrings 在 bash 中工作,但在/bin/sh
.
本网站推荐的语法称为此处文档。文件程序的输入从包含 的行的正下方开始<<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)