シェルスクリプトの文字列長

シェルスクリプトの文字列長

私はGRASSを使用していますが、1D数値ベクトルに関する質問があります。今私の出力は次のようになるので、このベクトルの長さを印刷したいと思います。

(1,2,3,4,5,6,7,8,9)
次のように表示する必要があります。
(1,2,3,4,5,6,7,8,9)
つまり、最後の区切り文字は必要ありません。これを行う方法はありますか?

私はPOSIX互換のソリューションが欲しい。

私のコードは次のとおりです

for i in $CATS
do 
 step=$step"$i,"
 echo $step
 g.region --overwrite vector="region_uspo_$i," save=regions_uspo
 regions_uspos="region_$i,"
 echo $regions_uspos
done

答え1

文字列を作成した後、最後のコンマを削除します。

for …
done
step=${step%,}
regions_uspos=${regions_uspos%,}

${VARIABLE%PATTERM}値に展開しVARIABLE、一致する最も短いサフィックスを削除しますPATTERN}。すべてのPOSIXシェルはこの設定をサポートしています。また、すべての BusyBox 構成でもサポートされます。

末尾のコンマなしで中間文字列が必要な場合は、ループ内の末尾のコンマを削除できます。または、要素を追加する前にコンマを追加して、末尾のカンマなしで文字列を作成します。最初のカンマを避けるには、ループ内の最初の反復を検出します。

first=1
for … do
  if [ -n "$first" ]; then
    first=
  else
    step="$step,"
    regions_uspos="$regions_uspos,"
  fi
  step="$step$i"
done

答え2

これを行う方法はいくつかあります。 1つの方法は、sepという新しい変数を作成することです。この変数は最初は空であると言った後はコンマに設定されますstep="$step$sep$i"

別の方法は条件付き拡張を使用することです。

step="${step+${step},}$i"

nameが設定されている場合、$ {name + value}はvalueに展開されます。この例では、携帯電話に値を正しく入力したと仮定すると、値は "$step"です。

別の方法は、変数に値を累積した後に変数の最初のコンマを削除することです。

答え3

はい、答えは次のとおりです。

for i in $var
do 
 step=$step"region_$i,"
done

step=${step%,}
echo $step
regions_uspos=${regions_uspos%,}

これは@Gillesの答えに基づいています。

関連情報