이것은 이전 주제에 대한 후속 조치입니다. 날짜 명령을 변수에 전달하시겠습니까?
글쎄요, 저는 /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(포함) 사이의 난수를 얻으려면 값이 [0, 32767] 범위에서 균일하기 $((RANDOM % 10000))
때문에 767보다 작은 값에 대해 약간의 편차가 발생합니다 . $RANDOM
균일한 분포를 얻고 앞에 0을 배치하려면 다음을 수행하십시오.
while a=$((RANDOM + 10000)); ((a <= 39999)); do :; done
a=${a#?}
다시 한번 말씀드리지만 이는 보안이 관련된 곳에서는 적용되지 않습니다. 출력을 $RANDOM
예측할 수 없습니다.
정말로 보안이 필요한 경우 이곳이 /dev/urandom
임의의 데이터를 얻을 수 있는 최적의 장소입니다. 대부분의 최신 unice에서는 호출이 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
POSIX 표준이 좋은 대안입니다. 호출해야 합니다. head
그렇지 않으면 fold
4자리 출력 라인이 영원히 유지됩니다.
답변2
fold
숫자의 무한한 흐름만 접혀지고 따라서 a
무한정 정의됩니다. 가장 쉬운 방법으로 kill 명령을 추가해야 합니다 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자리 난수로 이루어진 무한 스트림을 표시하고, 두 번째는 한 줄 후에 종료됩니다.