我有一个程序,prog
当我从终端调用它时,它接受一个整数参数,例如:
./prog 10
我想使用prog
一系列值执行,例如10, 20, 30, ...
.除了使用之外,还有一种巧妙的方法可以做到这一点:
./prog 10 ; ./prog 20 ; ./prog 30 ; ....
答案1
您可以在 Bash、Zsh 或 Ksh93 中使用简单的 for 循环。以下仅适用于 Bash 版本 4 (2009)、zsh 4.3.10 (2010) 和 ksh93r (2006)(尽管语法{x..y}
起源于zsh
(2.6-beta4
1995 年))。
#!/bin/bash
# since Bash v4
for i in {10..100..10}
do
$path_of_prog/prog $i
done
该{$start..$end..$step}
部分表示$i
开始时等于$start
并将$i
转到$end
。这是每一步增加的$step
金额。这样我们就得到了的$i
值。10 20 30 ... 100
$i
您也可以将其全部写在一行中
for i in {10..100..10}; do ./prog $i; done
如果您有较旧的 Bash 并且seq
可用 GNU,请使用以下行
#!/bin/bash
#only for pre Bash v4
for i in $(seq 10 10 100)
do
$path_of_prog/prog $i
done
或作为单衬
for i in $(seq 10 10 100);do ./prog $i; done
(上面假设您没有修改$IFS
变量)。
答案2
问题被标记为bash
,这只是为了其他 shell 的用户的利益。
在 POSIX sh 脚本中(为了可移植性):
i=10
while [ "$i" -le 100 ]; do
./prog "$i"
i=$(($i+10))
done
在 Bourne sh 脚本中(为了兼容 90 年代之前的系统):
echo '0[10+pd100>x]dsxx' | dc | xargs -n 1 ./prog
在zsh
(对于不限于使用 的人bash
):
i=0; repeat 10 ./prog $((i+=10))
或者
for i ({1..10}0) ./prog $i
或者:
for ((i=10;i<=100;i+=10)) ./prog $i
或者:
zargs -n1 {1..10}0 -- ./prog
答案3
有很多方法可以让 printf 为您执行此操作,但这里只是其中几种:
printf ' ./prog %d0\n' 1 2 3 | sh
或者您可能希望程序实际运行 30 次。seq
影响力和printf
与此目的非常匹配:
printf ' ./prog %d\n' `seq 1 30` | sh
或者,您的命令的结果可能涉及一些您不想在管道远端牺牲的变量值。好的。:
. <<CMD /dev/fd/0
$(printf './prog %d0\n' 1 2 3 )
CMD
可能您不需要数字,但需要字符串的多个副本,或者可能只有部分命令需要重复,但其他部分是静态的:
. <<CMD /dev/fd/0
$( { printf 'echo "this is part 1" >&2| ' ;\
printf 'echo "these are parts %d" >&2 | ' `seq 1 5` ; })
CMD
printf 'this string is repeated for each of printfs args,
but the args are not included%.0b\n' `seq 1 5`