쉘 스크립트의 문자열 길이

쉘 스크립트의 문자열 길이

저는 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

이를 수행하는 방법에는 여러 가지가 있습니다. 한 가지 방법은 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의 답변을 기반으로 합니다.

관련 정보