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

Jer*_*yA1 5 command-line shell bash

这个脚本很好用,我修改了它以增加 5。我的问题是我不需要最后一个逗号,我不知道如何删除它。

for ((i=1, j=0; i <= 12 ; i++, j=j+5))
do
 echo -n "$j,"
done
Run Code Online (Sandbox Code Playgroud)

Mic*_*mer 14

在 GNU 和其他一些系统上,对于这个特定问题,只需使用seq

seq -s, 0 5 55
Run Code Online (Sandbox Code Playgroud)

这给出了从 0 到 55(含)的序列,用逗号分隔。


有一些纯 bash 选项,如果您的问题比示例所建议的要复杂一些,它们可能会很有用。最标准的只是使用显式测试来确定您是否处于最后一次迭代中:

for ((i=1, j=0; i <= 12 ; i++, j=j+5))
do
 echo -n "$j"
 [ $i -lt 12 ] && echo -n ,
done
Run Code Online (Sandbox Code Playgroud)

这里我们只打印$j每次,并$i在打印逗号之前测试是否小于 12(即我们不在最后一次迭代)。

另一种方法是将整个输出构建为单个字符串:

for ((i=1, j=0; i <= 12 ; i++, j=j+5))
do
 ACCUM="$ACCUM$j,"
done
echo "${ACCUM%,}"
Run Code Online (Sandbox Code Playgroud)

在这里,我们ACCUM保留您已经打印出来的相同内容,但我们不会在循环本身中输出任何内容。您可以使用 : 修剪末尾的逗号${ACCUM%,}扩展到ACCUM末尾匹配,切断的任何内容的值。

不过,如果该seq选项适用于您的用例,我会选择这样做。


cho*_*oba 10

你很少真的需要在 bash 中使用循环:

echo {0..55..5} | sed 's/ /,/g'
Run Code Online (Sandbox Code Playgroud)


ste*_*ver 6

不是到处添加逗号然后删除最后一个逗号,而是使用IFS具有[*]数组扩展形式的变量的潜在“纯bash”解决方案

a=( {0..55..5} ); (IFS=, ; printf '%s\n' "${a[*]}")
0,5,10,15,20,25,30,35,40,45,50,55
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅BashGuide/Arrays - 包括对使用(...)子 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
Run Code Online (Sandbox Code Playgroud)


ter*_*don 5

您收到的更复杂的解决方案更好,但为了完整起见,您始终可以删除最后一个逗号sed

for ((i=1, j=0; i <= 12 ; i++, j=j+5))
do
 echo -n "$j,"
done | sed 's/,$//'
Run Code Online (Sandbox Code Playgroud)


mik*_*erv 5

这是一个 POSIX 兼容的解决方案:

i=-5
until [ $((i=i+5)) -eq 55 ]
    do printf ${i},
done && echo $i

###OUTPUT###
0,5,10,15,20,25,30,35,40,45,50,55
Run Code Online (Sandbox Code Playgroud)

或者,您可以操作 IFS:

 set -- $(echo $((i=0)); until (exit $((i-55))); do echo $((i=i+5)); done)
 IFS=,
 echo "$*"

###OUTPUT###
0,5,10,15,20,25,30,35,40,45,50,55
Run Code Online (Sandbox Code Playgroud)

但...

unset IFS
printf %s\\n "$@"

###OUTPUT###
0
5
10
15
20
25
30
35
40
45
50
55
Run Code Online (Sandbox Code Playgroud)

所有增量仍然$@$1- 中可用,并且在-中单独可用${12}

这个很有趣而且循环自由:

i= ; eval echo $(IFS=0; printf '${i:+,}$((i=i${i:++5}))%s' $(printf %012d))

###OUTPUT###
0,5,10,15,20,25,30,35,40,45,50,55
Run Code Online (Sandbox Code Playgroud)

随着bctr

echo '0;while(a+=5<=55){",";a}'|bc|tr -d \\n

###OUTPUT###
0,5,10,15,20,25,30,35,40,45,50,55
Run Code Online (Sandbox Code Playgroud)

或者只是bc和壳...

printf %s $(echo '0;while(a+=5<=55){",";a}'|bc)

###OUTPUT###
0,5,10,15,20,25,30,35,40,45,50,55
Run Code Online (Sandbox Code Playgroud)

使用 GNU dc

dc -e '[pq]sq0[rdn[,]P5+d55=qrdx]dx'

###OUTPUT###
0,5,10,15,20,25,30,35,40,45,50,55
Run Code Online (Sandbox Code Playgroud)

我最喜欢最后一个,但我对丑陋的dc剧本很着迷。