10에 도달할 때까지 숫자를 세고 출력한 다음 중지할 때마다 공백을 추가하는 스크립트를 만들고 싶습니다. 저는 스크립팅을 배우고 있으며 배우기 위해 간단한 스크립트를 만듭니다. 지금까지 내가 한 일은 다음과 같습니다.
x= 1
if ["$x" < "10"] then
echo [ $x += 1 ]
echo "\n"
then
echo "done!"
fi
답변1
간단한 if
, then
절은 다음으로 구성됩니다.
if followed by one or more conditions
then
some actions
fi
some further actions
보시 then
다시피 추가 처리를 수행하기 위해 다른 것을 추가할 필요가 없습니다. 따라서 귀하의 상황은 다음과 같아야 합니다:
x=1
if [ $x -le 10 ]
then
echo "$x"
((x++))
fi
echo 'Done!'
이제 work 절이 있지만 if
반환 된 유일한 항목 은 then
다음과 같습니다.1
Done!
if
이는 문이 조건을 한 번만 확인하고 fi
조건이 충족되면 스크립트가 추가 처리를 계속하기 때문입니다 .echo 'Done!'
아이디어를 실현하려면 while
루프를 사용해야 합니다. while
조건이 일치할 때까지 반복합니다 .
x=1
while [ $x -le 10 ]
do
echo $x
((x++))
done
echo 'Done!'
이제 while
변수의 값이 $x
10보다 작을 때마다 루프가 시작됩니다. 조건이 false를 반환하면($x의 값이 10보다 작거나 같음) 명령문으로 점프하여 done
추가 처리를 계속합니다. 이 경우echo 'Done!'
답변2
컴퓨터는 어떤 브랜치를 사용할지 결정할 수 없기 때문입니다! 각 if
분기는 부울 표현식 [TRUE/FALSE]를 사용하여 특정 코드를 실행하거나 실행하지 않습니다. 따라서 각 결정에는 작업 분기의 실행이 필요합니다. 그렇기 때문에 하나만 사용하면 됩니다 then
.
let 'x = 1'
if [ "$x" -lt 10 ] # if you want to write the `then` on the same line you need a ; in front of it
then
let 'x++'
echo "$x"
# echo automatically creates a newline
# the second then is useless or even wrong
echo "done!"
fi
help [
셸에서도 이를 볼 수 있습니다.
[: [ arg... ]
Evaluate conditional expression.
This is a synonym for the "test" builtin, but the last argument must
be a literal `]', to match the opening `['.
man -s1 test
유효한 테스트 표현식을 보려면 읽어보세요 .
힌트
귀하의 표현 [ "$x += 1" ] 은 실제로 1에서 10까지 반복하려는 것을 의미하는 것 같습니다. 쉘은 산술 지원이 제한되어 있으므로 다음을 사용하는 것이 좋습니다 seq
.
for x in `seq 1 9`
do echo $x
done
echo "done!"
for
매우 긴 시퀀스의 경우 루프에 대한 입력 문자열을 생성하지 않고 값을 하나씩 읽는 것이 좋습니다 .
seq 1 1000|while read x
do echo $x
done
그리고 확인 man 1 printf
하고 man 3 printf
(보통 printf(1) 및 printf(3)로 작성되지만 초보자라고 말씀하셨습니다) 공백을 추가하세요
printf "%*s%s" $x "" "line"
"line" 앞에 $x 공백을 추가하세요.
승리
for x in `seq 0 9`
do let 'y=2*(9-x)'
printf "%*s%s%*s%s\n" $x "" "data" $y "" "data"
done