如何在Bash的for循环中执行计算以动态调整x坐标
Bash循环生成递增x坐标标签的解决方案
我写了一段Bash代码,通过for循环生成带x坐标的<text>标签,但目前x值固定为30,无法实现每次循环递增20的需求。
原代码如下:
for ((i=1 ; i < $words2 + 1 ; i++)) ; do printf '%s %s %s\n' '<text x="30" y="10">'$i'</text>' | sed 's/ *$//' done
当前输出(x值固定):
<text x="30" y="10">1</text> <text x="30" y="10">2</text> <text x="30" y="10">3</text>
预期输出(x值从30开始每次递增20):
<text x="30" y="10">1</text> <text x="50" y="10">2</text> <text x="70" y="10">3</text>
解决方案
只需要在循环内动态计算x的取值即可,核心是用公式30 + (i-1)*20生成递增的x值。修改后的代码如下:
for ((i=1 ; i < $words2 + 1 ; i++)) ; do x=$((30 + (i-1)*20)) printf '<text x="%d" y="10">%d</text>\n' "$x" "$i" done
说明:
- 用
$((...))进行算术运算,计算每次循环对应的x值:第一次循环i=1时,x=30+0=30;i=2时x=30+20=50,以此类推。 - 优化了
printf写法,直接用格式占位符%d插入数值,避免字符串拼接和sed去尾空格的操作,更简洁高效。
如果需要保留原代码的sed处理逻辑,也可以写成:
for ((i=1 ; i < $words2 + 1 ; i++)) ; do x=$((30 + (i-1)*20)) printf '%s %s %s\n' "<text x=\"$x\" y=\"10\">" "$i" '</text>' | sed 's/ *$//' done
内容的提问来源于stack exchange,提问作者GJO2
相关产品推荐
相关产品推荐

