2017-04-01 157 views
0

我想编写一个bash脚本,它不断运行一个程序,并且每次都会将前四位数字递增一个,直到程序的输出从一个事物变为另一个事件。Bash脚本循环命令行参数

例如:

./exampleProgram的userName 0000-4567-4561-4564

输出:错误

./exampleProgram的userName 0001-4567-4561-4564

输出:错误

./exampleProgram的userName 0002-4567-4561-4564

输出:正确

-loop终止

最后三组四位数字将保持不变,这只是前四的是改变,因此最坏的情况是约10,000循环。

回答

1

只是遍历整数,并使用类似printf的东西来产生正确格式化的参数。例如

for ((i=0; i < 10000; i++)); do 
    printf -v sn '%04d-4567-4561-4564' "$i" 
    ./exampleProgram userName "$sn" 
done 
+0

由于某种原因,当我使用这个命令时,仍然需要在命令行上输入内容。这可能是程序设置的方式吗?为了阻止像这样的循环来强化结果?我仍然处于脚本的循环中,因为我不必一遍又一遍地运行它,但每次都会提示输入内容。 – frillybob

+0

如果不知道“exampleProgram”是什么,就不可能说出来。 – chepner

0

例如:

exampleProgram() {  #demo 
     echo "Debug: $1 $2" >&2 
     (($RANDOM % 10)) && { echo "Wrong"; return 1; } || { echo "Correct for $1 $2" ; return 0; } 
} 

for i in {0000..9999} 
do 
     res=$(exampleProgram JohnDoe "$i-4567-4561-4564") 
     [[ "$res" =~ Correct ]] && break; 
done 
echo "Loop terminated at ($i) - result $res" 

打印

Debug: JohnDoe 0000-4567-4561-4564 
Debug: JohnDoe 0001-4567-4561-4564 
Debug: JohnDoe 0002-4567-4561-4564 
Debug: JohnDoe 0003-4567-4561-4564 
Loop terminated at (0003) - result Correct for JohnDoe 0003-4567-4561-4564 

如果exampleProgram有不同的exit status它是更好地检查它,而不是返回的字符串,如:

res=$(exampleProgram JohnDoe "$i-4567-4561-4564") 
    (($?)) || break;