반복 시퀀스를 만드는 방법은 무엇입니까?

반복 시퀀스를 만드는 방법은 무엇입니까?

사용자로부터 변수를 가져와 다음과 같은 피라미드를 인쇄하는 스크립트를 만들려고 합니다.

*
**
***
****
*****

이 스크립트를 사용했지만 숫자가 표시됩니다.

for i in {1..5}

do

a=${a}${i}

echo ${a}

done

산출:

1
12
123
1234
12345

숫자 대신 "*" 기호를 삽입하는 방법은 무엇입니까?

답변1

루프 카운터 대신 변수 *에 문자를 추가 하면 됩니다 .a

for i in {1..5}
do
  a+='*'
  echo "${a}"
done

a="${a}*"대체 도 잘 작동하지만 이 버전이 더 깔끔하고 명확하다고 a+='*'생각합니다 .+=

while 루프를 사용하여 이 작업을 수행하려면 다음을 수행할 수 있습니다.

while (( "${#a}" < 5 )); do
  a+='*'
  echo "$a"
done

${#a}변수의 문자열 길이로 확장됩니다 a.

위의 코드 조각(및 질문의 코드)은 모두 a조각 시작 부분에서 var가 비어 있거나 설정되지 않은 것으로 가정합니다. 그렇지 않은 경우 먼저 다시 초기화해야 합니다.

a=

나는 당신이 bash 쉘을 사용하고 있다고 가정합니다. 이것은 전체 설명서입니다. 여기있어루프 구조에 대해.

답변2

디지털 트라우마이 경우 답변이 더 유효하지만 완전성을 위해 문자를 반복하는 전통적인 셸 방법을 사용할 수 있습니다 printf.

for i in {1..5}
do
  printf "%${i}s\n"
done | sed 's/ /*/g'

printf이는 필요한 공백 수를 출력한 다음 sed공백을 실제로 원하는 문자로 바꾸는 데 사용됩니다 .

지적한대로디지털 트라우마그리고재니스, 결과를 printf변수에 저장하고 쉘의 하위 문자열 대체를 사용하여 이를 방지할 수 있습니다 sed(대부분의 경우 많은 수의 하위 쉘을 생성하는 비용으로):

for i in {1..5}
do
  a=$(printf "%${i}s")
  echo "${a// /*}"
done

echo쉘이 *문자를 해석하지 못하도록 하려면 여기에 따옴표가 필요합니다 . 게다가 더 이상 echo.\n

지적한대로고지로tr다음보다 단일 문자를 바꾸는 데 더 적합합니다 sed.

for i in {1..5}
do
  printf "%${i}s\n"
done | tr ' ' '*'

(그러나 이 sed변형을 사용하면 원하는 길이의 텍스트를 반복할 수 있습니다.)

답변3

POSIX적으로:

$ n=5 awk 'BEGIN{OFS="*";for(i=2;i<=ENVIRON["n"]+1;i++){$i="";print}}'

답변4

sed및 해당 명령을 사용할 수 있습니다 s/regexp/replacement/flags.

seq 10 |sed 's/.*/printf "*%.0s" {1..&}/e'
*
**
***
****
*****
******
*******
********
*********
**********
  • 이것배너 e대체가 이루어진 경우 (패턴 공간에서) 발견된 명령을 실행하고 패턴 공간을 해당 출력으로 대체함을 나타냅니다. 보다암소 비슷한 일종의 영양sed수동.

  • 명령 printf "STRING%.0s" {1..7}인쇄일곱 번. 이것 좀 봐답변.

  • &내부에대안에서는 s/regexp/replacement/e패턴 공간의 전체 일치 부분을 참조합니다. 이 경우, 각 번호는 주어진 순서대로 순차적으로 배열됩니다 seq.

관련 정보