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))
;그러면 $
다른 것에 대한 접두사를 생략하는 것도 합리적으로 보일까요?