エコー変数から最後の文字を削除する

エコー変数から最後の文字を削除する

このスクリプトはうまく機能し、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 未満であるかどうか (つまり、最後の反復ではないかどうか) をテストします。

別の方法としては、出力全体を 1 つの文字列として構築する方法があります。

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

ここでは、ACCUMすでに出力していたものと同じものを保持しますが、ループ自体では何も出力しません。末尾のカンマは${ACCUM%,}次のように削除できます。拡大するとACCUM末尾の一致するものを,切り捨てた値。

ただし、そのオプションがあなたのユースケースに適している場合はseq、それを選択します。

答え2

bash でループが必要になることはほとんどありません。

echo {0..55..5} | sed 's/ /,/g'

答え3

あらゆる場所にカンマを追加して最後のカンマを削除する代わりに、配列拡張の形式IFSで変数を使用する潜在的な「純粋なbash」ソリューションがあります。[*]

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

見るBashガイド/配列(...)詳細については、親シェルの値を保持するためのサブシェルの使用法の説明も参照してくださいIFS


配列アプローチを使用したくない場合は、sedシェルの組み込み文字列置換機能を使用して外部コマンドを回避することができます。たとえば、(これも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/,$//'

関連情報