
이것은 이전 스레드의 후속 내용입니다. 날짜 명령을 변수에 전달합니까?
좋아요, 효과적으로 /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 -c
POSIX도 아니고 OpenBSD에도 없지만 다른 BSD와 Linux(GNU coreutils 및 BusyBox 모두 포함)에는 있습니다.
가 없는 시스템으로의 이식성이 필요한 경우 head -c
POSIX fold -w 4 | head -n 1
표준을 대체하는 것이 좋습니다. 호출 이 필요하다는 점을 참고하세요 head
. 그렇지 않으면 fold
4자리 줄이 영원히 계속 출력됩니다.
답변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자리 난수의 무한 스트림을 표시하고 두 번째는 한 줄 후에 중단됩니다.