나는 무작위, 심지어 16진수 숫자를 얻는 스크립트를 작성하려고 합니다. 나는 이 openssl
명령에 임의의 16진수를 생성하는 편리한 옵션이 있다는 것을 발견했습니다. 불행히도, 나는 그것이 균일해야 하고 내 스크립트에 어딘가에 유형 변환 오류가 있습니다. Bash는 새로 생성된 16진수를 문자열이라고 생각하므로 이를 2로 변경하려고 하면 스크립트가 실패합니다. 이것이 내가 지금까지 가지고 있는 것입니다:
...
hexVal="$(openssl rand -hex 1)"
while [ `expr $hexVal % 2` -ne 0 ]
do
hexVal="$(openssl rand -hex 1)"
done
...
나는 또한 아무 소용이 없는 다양한 다른 조합을 시도했습니다. 누군가 내 구문에 어떤 문제가 있는지 말해 줄 수 있다면 매우 감사하겠습니다.
답변1
배쉬를 사용하여
16진수 짝수 난수를 생성하려면:
$ printf '%x\n' $((2*$RANDOM))
d056
또는:
$ hexVal=$(printf '%x\n' $((2*$RANDOM)))
$ echo $hexVal
f58a
출력을 더 작은 숫자로 제한하려면 모듈로를 사용하십시오 %
.
$ printf '%x\n' $(( 2*$RANDOM % 256 ))
4a
openssl 사용
루프 솔루션을 실제로 사용하려면 다음을 수행하십시오 openssl
.
while hexVal="$(openssl rand -hex 1)"
do
((0x$hexVal % 2 == 0)) && break
done
이 0x
신호는 다음 숫자가 16진수임을 나타냅니다.
Bash의 숫자 변환 규칙
에서 man bash
:
0으로 시작하는 상수는 8진수로 해석됩니다. 앞에 0x 또는 0X가 있으면 16진수를 나타냅니다. 그렇지 않은 경우 숫자는 [base#]n 형식을 취합니다. 여기서 선택적 밑수는 산술 밑수를 나타내는 2~64 사이의 십진수이고 n은 해당 밑수의 숫자입니다. base#을 생략하면 base 10이 사용됩니다. n을 지정하면 9보다 큰 숫자는 소문자, 대문자, @, _의 순서로 표시됩니다. 밑수가 36보다 작거나 같은 경우 소문자와 대문자를 서로 바꿔서 사용하여 10에서 35 사이의 숫자를 나타낼 수 있습니다. [강조하다]
답변2
이건 어때?
printf "%0x\n" $(( ($RANDOM*2) & 0xff))
답변3
hexVal=1
while (( 16#$hexVal % 2))
do
hexVal=$(openssl rand -hex 1)
done
printf "%x [%d]\n" 0x$hexVal 0x$hexVal