shell脚本的字符串长度

shell脚本的字符串长度

我正在使用 GRASS,并且我对一维数字向量有疑问。现在,我想打印该向量的长度,因为我的输出如下所示:

(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 shell 都支持此构造。所有 BusyBox 配置也都支持它。

如果您需要不带尾随逗号的中间字符串,则可以去掉循环内的尾随逗号。或者,通过在附加元素之前添加逗号来构建不带尾随逗号的字符串。为了避免出现初始逗号,请检测循环中的第一次迭代。

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

答案2

有很多方法可以做到这一点。一种方法是创建一个新变量,例如 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 的回答

相关内容