
이 스크립트는 훌륭하게 작동하며 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/,$//'