从 echo 变量中删除最后一个字符

从 echo 变量中删除最后一个字符

该脚本运行良好,我将其修改为增加 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/,$//'

相关内容