나는 Linux vi에서 크랩스 게임을 만들려고 노력했지만 그것을 알아낼 수 없는 것 같습니다. 오류라고 말하면서 "if" 문을 "fi"로 끝낼 수 없습니다. 왜 이런가요? 1-6 사이의 난수 두 개를 생성해야 하며, 그 숫자가 추가되면 승리하거나 패배하거나 점수를 얻습니다. 도움이 필요하세요?
내가 시도한 것은 다음과 같습니다.
# craps.sh program inn bash shell
# $RANDOM returns a different random integer at each invocation.
# generate_random_number function which returns sum of
# 2 random number between 1 and 6
generate_random_number()
{
RANGE=6
#get 2 random numbers
number1=$RANDOM
number2=$RANDOM
# get it between 1 and 6
number1=$((($number1%$RANGE)+1))
number2=$((($number2%$RANGE)+1))
echo number 1 is $number1
echo number 2 is $number2
# add 2 numbers
sum=$(($number1+$number2))
echo sum is $sum
#return the sum
return $sum
}
# play_game() function invoked whenever user wants to play
play_game(){
# first throw
generate_random_number
sum=$?
# check if win or lost
if(($sum==2 || $sum==3 || $sum==12))
then
# lost then subtract wager from total amount
amount=$(($amount-$wager))
echo You Lost $wager$
fi
답변1
이것은 vi와 아무 관련이 없습니다.
"if" 뒤에는 공백이 필요합니다.
쉘 프로그래밍 튜토리얼을 읽어보세요.
당신은 또한 사용해야합니다https://www.shellcheck.net/
답변2
쉘 프로그래밍의 경우 이 return
명령은 다음을 전달하는 데 사용됩니다.상태대신 기능값. 값은 stdin 및 stdout을 통해 전달됩니다. 이는 디버그/자세한 메시지가 stderr에 인쇄되어야 함을 의미합니다.
roll_dice() {
local range=6
local sum=0
# add 2 random numbers
for i in {1..2}; do
(( sum += (RANDOM % range) + 1 ))
done
# "diagnostic" output to stderr
echo "sum is $sum" >&2
# values returned on stdout
echo "$sum"
}
그럼 당신은 할
play_game() {
# first throw
# capture the value using command substitution
sum=$( roll_dice )
진단 출력을 삭제하려면 다음을 수행하십시오.
sum=$( roll_dice 2>/dev/null )
노트:
- 일관성은 읽기 쉬운 코드의 핵심입니다. 여는 중괄호를 새 줄이나 같은 줄에 배치하되, 둘 다 배치하면 안 됩니다.
- 변수 이름을 모두 대문자로 사용하지 마십시오. 변수 이름을 쉘용으로 예약해 두십시오.
- Bash 산술 표현식에서는
$
변수가 필요하지 않습니다.
답변3
이므로 bash
스크립트 끝에 뭔가가 누락되었습니다.
[...]
amount=$(($amount-$wager))
echo You Lost $wager$
fi
# close function
}
# get a wager
read -p "Enter wager " wager
# validate and call play_game()
((wager>0)) && play_game || echo "Invalid wager: $wager"
이것은 TIO에 있습니다: