while 루프 및 모듈로에 대한 쉘 스크립트의 올바른 유형 변환

while 루프 및 모듈로에 대한 쉘 스크립트의 올바른 유형 변환

나는 무작위, 심지어 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

관련 정보