n
명령줄 자체에서 입력한 임의의 문자 단어를 인쇄하려고 하는데 n
어떤 이유로 내 스크립트가 매번 동일한 값으로 동일한 대답을 제공합니다 n
.
#!/bin/bash
num=$1
egrep "^.{$num}$" /usr/share/dict/words | head -n $RANDOM| tail -n 1
나는 다음과 같이 스크립트를 호출합니다.
$ bash var3.sh 5
étude # always the same output when using 5
$ bash var3.sh 3
zoo # always the same output when using 3
내 스크립트의 이름은 어디에 var3.sh
있고 5는 무작위로 인쇄하려는 단어의 길이입니다.
정말로 임의의 단어를 인쇄하려면 어떻게 해야 합니까?
답변1
그러나 실제로는 그렇지 않습니다. 그러나 $RANDOM은 특히 제한된 길이의 단어에 대해 큰 숫자(0에서 32767 사이)를 반환하며 해당 부분이 grep의 모든 결과를 반환할 수 있는 것과 동일한 결과를 표시합니다 head
(3의 경우 my 에 819개의 일치 항목만 있음 /usr/share/dict/words
).
더 나은 해결책은 결과를 뒤섞는 것입니다.
egrep "^.{$num}$" /usr/share/dict/words | sort -R | tail -n 1
이는 (GNU 확장)을 -R
의미합니다 .--random-sort
sort
답변2
원하는 것을 인쇄하는 쉬운 방법일련번호-알파벳 단어의 사용 shuf
:
egrep "^.{$num}$" /usr/share/dict | shuf -n1
이 shuf
명령은 입력의 무작위 순열을 출력하며, 이 -n1
플래그는 해당 결과의 첫 번째 항목만 출력하도록 지시합니다.
답변3
다른 사람들이 지적했듯이 코드의 주요 문제점은 $RANDOM
종종 값이 특정 길이의 단어 수보다 훨씬 크다는 것입니다.
다음만 사용하세요 awk
:
$ awk -v len="$num" 'length == len { word[i++]=$0 }
END { print word[int(i*rand())] }' /usr/share/dict/words
Bosniac
이 프로그램은 주어진 파일에서 특정 길이의 모든 라인을 읽습니다. 이것들은 배열에 저장됩니다 words
.
마지막으로 이 배열에서 임의의 요소를 선택하고 인쇄합니다.