제가 받은 테스트 문제는 다음과 같습니다.
다음 출력 줄에서 첫 번째 항부터 n번째 항(포함)까지 피보나치 수열의 다음 항을 작성합니다. 피보나치 수열의 첫 번째 항과 두 번째 항은 각각 0과 1이라고 가정합니다.
피보나치 수열을 생성하기 위해 쉘 코드를 복사했습니다(여기에서), 조건문이 필요 1<=n<=50
하지만 while 루프 뒤에 추가하는 방법을 모르겠습니다.
function fib
{
x=0
y=1
i=2
echo "Fibonacci Series up to $n terms :"
echo "$x"
echo "$y"
while [ $i -lt $n ]
do
i=`expr $i + 1 `
z=`expr $x + $y `
echo "$z"
x=$y
y=$z
done
}
r=`fib $n`
echo "$r"
답변1
함수를 중단하기 위해 루프 전에 이 작업을 수행할 수 있습니다.
if [[ $n -lt 1 ]] || [[ $n -gt 50 ]]
then
return
fi
다음과 같이 입력 값을 제한할 수도 있습니다.
if [[ $n -lt 1 ]]
then
n=1
fi
if [[ $n -gt 50 ]]
then
n=50
fi
첫 번째 옵션이 포함된 코드의 작업 버전은 다음과 같습니다.
function fib
{
x=0
y=1
i=2
n=$1
if [[ $n -lt 1 ]] || [[ $n -gt 50 ]]
then
return
fi
echo "Fibonacci Series up to $n terms :"
echo "$x"
echo "$y"
while [[ $i -lt $n ]]
do
i=`expr $i + 1 `
z=`expr $x + $y `
echo "$z"
x=$y
y=$z
done
}
r=`fib $n`
echo "$r"
답변2
bash 및 기타 Korn과 유사한 쉘에서는산술 표현식에서 정리되지 않은 데이터 사용여기에는 임의의 명령 실행 취약점을 유발하는 내부 산술 연산자를 위한 Korn 스타일 ((...))
및 구성 매개변수가 포함됩니다.$((...))
[[...]]
expr
종종 신뢰할 수 없고 수십 년이 지났습니다.
따라서 산술 컨텍스트에서 입력을 사용하기 전에 입력을 삭제하여 예상한 형식의 유효한 숫자인지 확인해야 합니다.
Bash 산술 표현식에서 앞에 0이 있는 숫자는 8진수로 해석되므로 이를 거부하는 것이 가장 좋습니다. 마지막으로 1 .. 50 이외의 숫자를 필터링하려면 텍스트 패턴 일치를 사용하는 것이 더 쉬울 수 있습니다.
case $1 in
([123456789] | [1234][0123456789] | 50) ;;
(*) echo>&2 Not a decimal integer number in the 1..50 range; exit 1
esac
답변3
최신 셸에서는 더 이상 사용되지 않는 오래된 수학 구문과 백틱을 피하여 가독성을 높입니다.
#!/bin/bash
fib(){
x=0 y=1 i=2 n=$1
((n < 1 || n > 50)) && return
echo "Fibonacci Series up to $n terms :"
echo "$x"
echo "$y"
while ((i++ < n)); do
z=$((x+y))
echo "$z"
x=$y y=$z
done
}
read -p 'Type an integer between 1 and 50 as max terms >>> ' n
r=$(fib $n)
echo "$r"
((...))
$((...))
표현식이 0이 아니면 종료 상태 0을 반환하고 표현식이 0이면 1을 반환하는 산술 명령입니다 . 부작용(할당)이 필요한 경우 "let"의 동의어로도 사용됩니다. 바라보다http://mywiki.wooledge.org/ArithmeticExpression.
백틱은 이전 스타일의 명령 대체에 사용됩니다. foo=$(command)
대신 이 구문을 사용하는 것이 좋습니다. 내부 백슬래시 처리는 $()
놀라운 일이 아니며 $()
중첩하기가 더 쉽습니다. 바라보다http://mywiki.wooledge.org/BashFAQ/082
expr
고대 쉘 코드에서 수학을 수행하는 데 사용되는 프로그램입니다. bash와 같은 Posix 셸에서는 $(( expression ))
bash, ksh, mksh, pdksh, yash, dash, ash, sh 또는 zsh를 사용할 수도 있습니다.(( expression ))