에코 변수에서 마지막 문자 제거

에코 변수에서 마지막 문자 제거

이 스크립트는 훌륭하게 작동하며 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보다 작은지(즉, 마지막 반복에 있지 않은지) 테스트합니다.

대안은 전체 출력을 단일 문자열로 작성하는 것입니다.

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

ACCUM여기서는 이미 인쇄한 것과 동일한 내용을 유지하지만 루프 자체에서는 아무것도 출력하지 않습니다 . ${ACCUM%,}: that을 사용하여 끝에 있는 쉼표를 잘라낼 수 있습니다.다음으로 확장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

보다BashGuide/배열(...)자세한 내용은 상위 쉘의 값을 보존하기 위해 하위 쉘 을 사용하는 방법에 대한 설명을 포함합니다 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/,$//'

관련 정보