该脚本运行良好,我将其修改为增加 5。我的问题是我不需要末尾的最后一个逗号,并且我不知道如何删除它。
for ((i=1, j=0; i <= 12 ; i++, j=j+5))
do
echo -n "$j,"
done
答案1
在 GNU 和其他一些系统上,对于这个特定问题,只需使用seq
:
seq -s, 0 5 55
这给出了从 0 到 55(含)的序列,用逗号分隔。
有一些纯 bash 选项,如果您的问题比示例建议的更复杂一些,它们可能会很有用。最标准的方法是使用显式测试来确定是否处于最后一次迭代:
for ((i=1, j=0; i <= 12 ; i++, j=j+5))
do
echo -n "$j"
[ $i -lt 12 ] && echo -n ,
done
这里我们每次只打印出$j
,并在打印逗号之前测试是否$i
小于 12 (即我们不是在最后一次迭代)。
另一种方法是将整个输出构建为单个字符串:
for ((i=1, j=0; i <= 12 ; i++, j=j+5))
do
ACCUM="$ACCUM$j,"
done
echo "${ACCUM%,}"
在这里,我们保留了ACCUM
您已经打印出来的相同内容,但我们不在循环本身中输出任何内容。您可以用以下命令删除末尾的逗号${ACCUM%,}
您可以用: that扩展到的值ACCUM
与末尾匹配的任何内容都,
被截断。
不过,如果该seq
选项适合您的用例,我会选择它。
答案2
在 bash 中你很少真正需要循环:
echo {0..55..5} | sed 's/ /,/g'
答案3
这里有一个潜在的“纯 bash”解决方案,使用数组扩展形式的IFS
变量,而不是到处添加逗号然后删除最后一个逗号[*]
a=( {0..55..5} ); (IFS=, ; printf '%s\n' "${a[*]}")
0,5,10,15,20,25,30,35,40,45,50,55
看BashGuide/数组有关详细信息 - 包括使用(...)
子 shell 来保留父 shellIFS
值的解释。
如果您不想使用数组方法,那么您可以sed
通过使用 shell 的内置字符串替换功能来避免使用外部命令,例如(同样在 bash 中)
printf -v str '%s,' {0..55..5}; printf '%s\n' "${str%,}"
0,5,10,15,20,25,30,35,40,45,50,55
答案4
您收到的更复杂的解决方案更好,但为了完整起见,您始终可以删除最后的逗号sed
:
for ((i=1, j=0; i <= 12 ; i++, j=j+5))
do
echo -n "$j,"
done | sed 's/,$//'