從 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/,$//'

相關內容