bash 中从 1 到 n 的字符串的参数化填充
Parametrized population of a string in bash from 1 to n
有没有简单的方法来使用大小参数填充动态字符串?
假设,我们有:
Case N=1:
echo "Benchmark,Time_Run1" > $LOGDIR/$FILENAME
然而,运行 变量是参数化的,我们希望拥有从 1 到 n 的所有 Time_Run
:
Case N=4:
echo "Benchmark,Time_Run1,Time_Run2,Time_Run3,Time_Run4" > $LOGDIR/$FILENAME
一般的解决方案应该是这种形式:
Case N=n:
echo "Benchmark,Time_Run1,...,Time_Run${n}" > $LOGDIR/$FILENAME
有没有一种方法可以在单个循环中执行此操作而不是使用两个循环,一个循环遍历 n 以生成 运行${n} 另一个循环 n 次以附加“Time_Run" 到列表(类似于 Python)?谢谢!
使用从 1 到 $n
的循环。
{
printf 'Benchmark'
for ((i = 1; i <= $n; i++)); do
printf ',Time_Run%d' $i
done
printf '\n'
} > $LOGDIR/$FILENAME
用单个循环填充输出字符串的一种方法是:
outstr=Benchmark
for ((i=1; i<=n; i++)); do
outstr+=",Time_Run$i"
done
不循环也可以做到:
eval "printf -v outstr ',%s' Time_Run{1..$n}"
outstr="Benchmark${outstr}"
但是,eval
是危险的,应该只在没有合理选择的情况下使用。事实并非如此。参见 Why should eval be avoided in Bash, and what should I use instead?。
有没有简单的方法来使用大小参数填充动态字符串?
假设,我们有:
Case N=1:
echo "Benchmark,Time_Run1" > $LOGDIR/$FILENAME
然而,运行 变量是参数化的,我们希望拥有从 1 到 n 的所有 Time_Run
:
Case N=4:
echo "Benchmark,Time_Run1,Time_Run2,Time_Run3,Time_Run4" > $LOGDIR/$FILENAME
一般的解决方案应该是这种形式:
Case N=n:
echo "Benchmark,Time_Run1,...,Time_Run${n}" > $LOGDIR/$FILENAME
有没有一种方法可以在单个循环中执行此操作而不是使用两个循环,一个循环遍历 n 以生成 运行${n} 另一个循环 n 次以附加“Time_Run" 到列表(类似于 Python)?谢谢!
使用从 1 到 $n
的循环。
{
printf 'Benchmark'
for ((i = 1; i <= $n; i++)); do
printf ',Time_Run%d' $i
done
printf '\n'
} > $LOGDIR/$FILENAME
用单个循环填充输出字符串的一种方法是:
outstr=Benchmark
for ((i=1; i<=n; i++)); do
outstr+=",Time_Run$i"
done
不循环也可以做到:
eval "printf -v outstr ',%s' Time_Run{1..$n}"
outstr="Benchmark${outstr}"
但是,eval
是危险的,应该只在没有合理选择的情况下使用。事实并非如此。参见 Why should eval be avoided in Bash, and what should I use instead?。