我一直在尝试编写一个更好的bash脚本,用不同的输入文件重复运行指定的程序。这是有效的基本暴力版本,但我希望能够在" .txt"之前使用循环来更改参数。
#!/bin/bash
./a.out 256.txt >> output.txt
./a.out 512.txt >> output.txt
./a.out 1024.txt >> output.txt
./a.out 2048.txt >> output.txt
./a.out 4096.txt >> output.txt
./a.out 8192.txt >> output.txt
./a.out 16384.txt >> output.txt
./a.out 32768.txt >> output.txt
./a.out 65536.txt >> output.txt
./a.out 131072.txt >> output.txt
./a.out 262144.txt >> output.txt
./a.out 524288.txt >> output.txt
我试图创建一个for循环并更改参数:
#!/bin/bash
arg=256
for((i=1; i<12; i++))
{
#need to raise $args to a power of i
./a.out $args.txt << output.txt
}
但是我的./a.out错误地说明&#34; .txt&#34;不存在。将args提升到i的幂并将其用作./a.out的参数的正确方法是什么?
答案 0 :(得分:3)
这就是你需要做的所有事情:
for ((i=256; i<=524288; i*=2)); do ./a.out "$i.txt"; done > output.txt
每次循环迭代时,i
乘以2,产生您想要的序列。我没有将每次迭代的输出分别重定向到文件,而是将重定向移到了循环之外。这样,文件将只包含循环中的内容。
在您的问题中,$args
为空(我猜您打算放$arg
),这就是您的文件名仅为.txt
的原因。此外,您使用了<<
而不是>>
,我认为这是一个错字。
答案 1 :(得分:1)
检查一下:
seq 12 | xargs -i echo "256 * 2 ^ ({} - 1)" | bc | xargs -i echo ./a.out {}.txt
如果确定,请放弃echo
并添加>> output.txt
seq 12 | xargs -i echo "256 * 2 ^ ({} - 1)" | bc | xargs -i ./a.out {}.txt >> output.txt