使用各种参数执行程序(循环)

使用各种参数执行程序(循环)

我有一个程序,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}起源于zsh2.6-beta41995 年))。

#!/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`

相关内容