私は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の答えに基づいています。