Bash增量输入文件名

时间:2014-10-27 18:38:38

标签: bash file input

我一直在尝试编写一个更好的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的参数的正确方法是什么?

2 个答案:

答案 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