사용자로부터 변수를 가져와 다음과 같은 피라미드를 인쇄하는 스크립트를 만들려고 합니다.
*
**
***
****
*****
이 스크립트를 사용했지만 숫자가 표시됩니다.
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
.