/dev/urandom의 내용을 변수에 넣으시겠습니까?

/dev/urandom의 내용을 변수에 넣으시겠습니까?

이것은 이전 스레드의 후속 내용입니다. 날짜 명령을 변수에 전달합니까?

좋아요, 효과적으로 /dev/urandom이 4자리 숫자를 생성하고 싶습니다. 그리고 변수에 넣으세요.

다음은 내 bash 스크립트의 예입니다.

#!/bin/bash
for (( c=0; c<=10; c++))
do
        a="$(tr -dc '[:digit:]' < /dev/urandom | fold -w 4)"

        echo $a
done

내가 결과를 "에코"하려는 유일한 이유는 /dev/urandom이 나에게 올바르게 4자리 숫자를 생성했는지 실제로 볼 수 있기 때문입니다.

만들고 싶은 bash 스크립트의 경우 생성된 결과에 대해 추가 작업을 수행하려면 프로그래밍 방식으로 이 작업을 수행해야 합니다.

따라서 결과를 "에코"할 필요가 없습니다. 그렇습니다a="$(tr -dc '[:digit:]' < /dev/urandom | fold -w 4)"

실제로 변수 "a"에 4개의 임의의 숫자를 배치합니까? 내 스크립트에서 "a"를 에코하면 콘솔이 정지되고 콘솔을 다시 가져오려면 "CTRL+C"를 사용해야 합니다.

내가 시도하는 것은 /dev/urandom의 임의의 숫자 4개를 변수에 배치하는 것입니다.

나는 bash 스크립팅을 처음 접했기 때문에 모든 조언을 환영하며 도움이나 제안에 대해 미리 감사드립니다.

답변1

보안이 필요하지 않으면 bash의 내장 기능을 사용할 수 있습니다RANDOM변하기 쉬운. 0에서 9999 사이의 난수를 얻으려면 $((RANDOM % 10000))값이 $RANDOM[0, 32767] 범위에서 균일하기 때문에 767보다 작은 값에 작은 편향을 제공합니다. 균일한 분포를 얻고 앞에 0을 넣으려면 다음을 수행하십시오.

while a=$((RANDOM + 10000)); ((a <= 39999)); do :; done
a=${a#?}

보안이 우려되는 곳에서는 적용할 수 없다는 점을 다시 한 번 참고하세요. 의 출력은 $RANDOM예측할 수 없습니다.

보안이 필요한 경우 /dev/urandom임의의 데이터를 얻을 수 있는 올바른 장소입니다. 대부분의 최신 유니스에서는 호출이 fold필요하지 않습니다. 로 4자를 잡을 수 있습니다 head -c.

a=$(</dev/urandom tr -dc 0-9 | head -c 4)

head -cPOSIX도 아니고 OpenBSD에도 없지만 다른 BSD와 Linux(GNU coreutils 및 BusyBox 모두 포함)에는 있습니다.

가 없는 시스템으로의 이식성이 필요한 경우 head -cPOSIX fold -w 4 | head -n 1표준을 대체하는 것이 좋습니다. 호출 이 필요하다는 점을 참고하세요 head. 그렇지 않으면 fold4자리 줄이 영원히 계속 출력됩니다.

답변2

fold무한한 숫자의 흐름을 접을 뿐이므로 a무기한으로 정의됩니다. 가장 간단한 종료 명령을 추가해야 합니다 head.

 a="$(tr -dc '[:digit:]' < /dev/urandom | fold -w 4 | head -n1)"

이 두 명령의 동작을 비교해 보세요.

tr -dc '[:digit:]' < /dev/urandom | fold -w 4  
tr -dc '[:digit:]' < /dev/urandom | fold -w 4 | head -n1

첫 번째는 4자리 난수의 무한 스트림을 표시하고 두 번째는 한 줄 후에 중단됩니다.

관련 정보