난수에 대한 bash 오류 구문

난수에 대한 bash 오류 구문

od -vAn -N4 -tu4 < /dev/urandom내 작업은 읽은 두 숫자 사이에 임의의 숫자()를 표시하는 것입니다 . 최소값 예외와 생성된 난수를 확인할 때 구문 오류가 발생하는 이유를 이해할 수 없습니다.

내 코드 부분이 프랑스어로되어 있습니다

#!/bin/bash

randomMax=2147483647
randomMin=−2147483648
valide=true
echo "Entrez un nombre : "
read nombre1

echo "Entrez un autre nombre : "
read nombre2

if [[ $nombre1 -lt $randomMin || $nombre1 -ge $randomMax ]]; then
   echo "Le premier chiffre est hors de porté du random"
   valide=false

elif [[ $nombre2 -lt $randomMin || $nombre2 -ge $randomMax ]]; then
   echo "Le deuxième chiffre est hors de porté du random"
   valide=false
fi

if [[ $nombre2 -lt $nombre1 ]]; then
   nombre3=$nombre2
   nombre2=$nombre1
   nombre1=$nombre3
fi

if [[ $valide == true ]]; then
   randomNumber=$(((od -vAn -N4 -tu4 < /dev/urandom) % nombre2))
   echo "Voici le nombre : $((number1 + randomNumber))"
fi

답변1

이 줄

randomNumber=$(((od -vAn -N4 -tu4 < /dev/urandom) % nombre2))
$ echo $(((od -vAn -N4 -tu4 < /dev/urandom) % nombre2))
-bash: (od -vAn -N4 -tu4 < /dev/urandom) % nombre2: syntax error: operand expected (error token is "/dev/urandom) % nombre2")

맞습니다. 외부는 $((...))산술 확장입니다.

내부적으로 명령을 (...)호출하기 위한 것이므로 명령 대체가 od필요합니다 .$(...)

randomNumber=$(( $(od -vAn -N4 -tu4 < /dev/urandom) % nombre2))
 $ nombre2=100
 $ echo $(( $(od -vAn -N4 -tu4 < /dev/urandom) % nombre2))
 47

답변2

다음과 같은 다양한 연산자를 지정해야 합니다.

  • 산술 평가,$(( ..... ))
  • 서브셸에서 명령을 실행합니다.$( ..... )

리더십 $은 부분이다오퍼레이터의 오프닝 시퀀스. (다소 어리석은) 몇 가지 예:

  • 산술 평가 내 서브셸 실행: 연도 모델 월,
echo $(( $(date +%Y) % $(date +%m) ))
  • Subshell은 내부 산술 평가를 수행합니다.: 2부터 30까지의 숫자를 세고 에포크 이후의 초 수에 해당하는 날짜를 인쇄합니다.
echo "Quite some $(date --date="@ $((1 << 30))" -R) time ago"

이제 코드에 대해 다시 생각해 보세요.

randomNumber=$(((od -vAn -N4 -tu4 < /dev/urandom) % nombre2))

당신은 무엇을하길 원합니까산술 평가 내 서브셸 실행;이제 무엇이 빠졌는지 아시나요?



나는 당신의 초기 혼란의 원인을 짐작할 수 있다고 생각합니다. 산술 평가에서는 다음을 참조할 수 있습니다.변수에일반적인 $접두사 없이:

z=42
echo $((33 + z))

그리고

z=42
echo $((33 + $z))

;그러면 $다른 것에 대한 접두사를 생략하는 것도 합리적으로 보일까요?

관련 정보