从我的bash脚本调用另一个bash脚本,给它一些输入值

时间:2014-03-04 14:12:07

标签: linux bash shell arguments

我有一个简单的bash脚本,它会调用另一个脚本10次:

#!/bin/sh

val=10
for i in `seq $val`
do
       ./script2.sh flename$i
done

script2.sh取2个输入参数(不是cmd参数,两个输入变量)(对我而言,无论哪个参数都可以,它们只能是2个相同的字符串)。现在=如何在script2.sh循环中将这2个相同的字符串传递给for

我试过了:

./script2.sh flename$i | string1 | string1

但它并不像我想要的那样有用。

2 个答案:

答案 0 :(得分:1)

该语法类似于

printf '%s\n' "$string1" "$string2" | ./script2.sh filename"$i"

你也可以使用这里的文件:

./script2.sh filename"$i" <<____HERE
$string1
$string2
____HERE

有些人会告诉你echo,但它有各种可移植性问题等; printf统一标准且更安全。但如果它只是两个静态的字符串行,你当然可以做到

echo 'string1
string2' | ./script2.sh filename "$i"

(是的,这是一个单引号的字符串,中间有换行符)或效率稍低

( echo string1; echo string2 ) | ./script2.sh filename"$i"

管道的一般语法是command1 | command2 | command...,所以除非string1是产生所需输出的命令,否则你所拥有的语法将无效。 (这不是不可能做到的,但在这个特定情况下可能不是一个好主意。)但最重要的是,你将脚本的输出汇总到string1,你明显要反过来。

任何产生合适输出的命令都可用于输入管道;如果您需要大量输入,请尝试yes,它专门用于此目的;

yes string1 | head -n 2 | ./script2.sh filename"$i"

在这里,yes打印出无穷无尽的string1行序列(好吧,当管道被head关闭时,它会结束); head只通过前两个。

答案 1 :(得分:0)

你只需要使用

./script2.sh flename$i "string1" "string2"

然后在script2中,文件名$ i将作为$ 1,string1作为$ 2,string2作为$ 3