Shell脚本:将每一行作为参数传递给另一个脚本

时间:2016-11-28 18:00:16

标签: bash shell

美好的一天。

在工作中我有一个脚本,它接收一个数字作为参数,它向我显示一些与该数字相关的信息作为输出。

有些时候我会收到一个庞大的数字列表,并且在白天多次执行此脚本需要花费我很多时间。

我想知道是否有办法将所有这些数字保存在文件中,并指示所述文件的每一行都由脚本执行。

让我们说我的文件包含以下数字:

999999999
888888888
777777777
666666666
555555555

,脚本执行如下:

sh script.sh 55(Number) go

提前致谢。

2 个答案:

答案 0 :(得分:2)

假设您的输入位于input.txt,则会执行简单的while read循环:

while read -r line <&3; do
  sh script.sh "55${line}" go
done 3<input.txt

有关此技术的讨论,请参阅BashFAQ #1

一些注意事项:

  • sh script.sh实际上是非常糟糕的形式:它忽略了该脚本中的shebang行,因此它不能再指定自己的解释器。在使脚本可执行后运行./script.sh要好得多;这样,如果它有#!/usr/bin/env bash#!/usr/bin/ksh或任何其他将被尊重的shebang,那么你不会冒着导致你的脚本失败的风险,因为它是为一个POSIX sh解释器运行它更有能力的shell语言。
  • 3<input.txt将输入文件放在描述符3上,而不是使用stdin的默认<input.txt重定向;使用备用文件描述符编号可确保您的脚本可以从用户读取(从标准输入提示),如果需要的话。

答案 1 :(得分:1)

实现这一目标的一种方法是使用xargs,例如:

xargs -I{} sh script.sh 55{} go < numbers.txt

这假定您将数字放在名为numbers.txt的文件中。 对于文件中的每一行,{}中的sh script.sh 55{} go将替换为该行中的值。

例如:

xargs -I{} echo number is: {} < input

鉴于您的样本输入,上面将产生:

number is: 999999999
number is: 888888888
number is: 777777777
number is: 666666666
number is: 555555555