난수를 인쇄하기 위해 가변 길이 루프를 만드는 방법은 무엇입니까?

난수를 인쇄하기 위해 가변 길이 루프를 만드는 방법은 무엇입니까?

사용자에게 난수의 행과 열 수를 묻는 메시지를 표시한 후 난수 행렬을 만들려고 합니다. 중첩된 for 루프만 사용할 수 있습니다.

행과 열이라는 두 가지 변수를 만들었지만 주요 문제는 for 루프가 올바르게 에코되도록 하는 것입니다. 이것은 내 루프 기능입니다

    for i in [1..$rows]; do
    echo "$RANDOM";
    done

i의 값을 1+1로 증가시키려고 시도했지만 상관없이 루프는 한 번만 실행됩니다. 스크립트가 $rows의 값을 읽도록 하고 싶습니다.

답변1

유사한 구문이 없습니다 [x..y]. {x..y}라고 생각하실 수도 있지만그건 작동하지 않아if x또는y 변수.

따라서 다음 중 하나를 시도해 볼 수 있습니다.

for ((i=1;i<=$rows;i++)); do
    echo "$RANDOM"
done

또는

for i in $(seq 1 "$rows"); do
    echo "$RANDOM"
done

또는

i=0 
while (( ++i <= rows)); do
    echo "$RANDOM"; 
done

심지어

i=0
until [ $i -gt $rows ]; do 
    echo "$RANDOM"
    ((i++))
done

답변2

astden지적, 사용한 구문이 올바르지 않습니다. 그런 다음 그는 루프의 몇 가지 예를 제시했습니다.회의일하다.

그러나 $rows임의의 정수 수를 인쇄하려면 다음을 사용할 수도 있습니다.

jot -r "$rows"

또는 동등하게,

jot -r "$rows" 1 100

$rows1에서 100 사이의 임의의 정수를 출력합니다 ( jotBSD 시스템 또는 일부 Linux 시스템의 패키지에 포함됨 athena-jot).

또는,

shuf -i 1-100 -r -n "$rows"

jot위의 명령과 동일한 작업을 수행합니다 ( shufGNU coreutils의 일부입니다).

$cols시간 항목의 매트릭스를 생성하려면 $rows다음을 사용할 수 있습니다 rs( BSD 시스템 또는 일부 Linux 시스템의 패키지 rs에서 사용 가능 ).rs

$ rows=4
$ cols=6
$ jot -r "$(( rows * cols ))" | rs "$rows" "$cols"
37  29  2   74  5   14
82  86  74  63  73  9
58  10  14  96  12  90
98  13  55  56  40  52

$rows * $cols난수가 필요하다는 점에 유의하세요 . 여기에 사용된 예는 에서 이러한 값을 가져오지만 jot( shuf또는 숫자를 생성하는 다른 명령)을 사용할 수도 있습니다.

답변3

그리고 zsh:

$ eval print -C4 '$(('{1..20}', RANDOM))'
11190  17138  16156  5735
16751  13545  22647  13244
12925  11584  10984  32387
32093  8170   5305   6102
25136  30299  3944   9956

또는 GNU를 사용하여 shuf범위를 지정합니다.

$ print -C4 $(shuf -i 0-99 -n 20)
96  55  93  33
25  7   19  60
34  51  88  46
79  13  70  98
63  37  69  41

관련 정보