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

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

스크립트가 제대로 작동하여 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

여기서는 매번 time 을 인쇄하고 $j쉼표를 인쇄하기 전에 12보다 작은지 테스트합니다 $i(즉, 마지막 반복이 아닙니다).

또 다른 접근 방식은 전체 출력을 단일 문자열로 작성하는 것입니다.

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

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

관련 정보