무작위로 명령 실행


24

나는 두 가지 명령 중 하나를 실행하려는 C1C2무작위로합니다. 커맨드 라인 (bash)에서 어떻게합니까? 하나의 라이너가 가능하다면 감사하겠습니다.

답변:


33
if (( RANDOM % 2 )); then C1; else C2; fi

1
C1을 실행할 때 1 in N 확률을 원하면을 사용 (( RANDOM % N == 0 ))하지 말아야합니다 (( RANDOM % N )). N = 2의 특수한 경우에만 동일한 확률을 갖습니다.
Acumenus

@ABB == 0((비교없이 블록에 내재되어 있으므로 의미가 확실하지 않습니다.
Chris Down

@ABB == 0는 이전 의견에서 오타입니다 > 0. 이후 % 100거의 항상 위의 값이 돌아갑니다 0예상됩니다.
Chris Down

2
실용적으로 사용 RANDOM % $N하지 않는 것은 무엇 == 0입니까? 예를 들어 N = 100 인 IMO의 경우 100 개 확률 == 0로 99 개 (없이 제공)보다 100 개 확률로 1 개 (와 함께 제공됨)를 원하는 것이 훨씬 실용적 == 0입니다.
Acumenus

21

특별한 경우 :

C$((RANDOM%2+1))

작동합니다 :) 그리고 가장 짧은 답변입니다!


왜 그 주위에 두 세트의 괄호가 필요합니까? 나는 당신이 사용한 것에 익숙하지 않습니다.
AJMansfield

2
@AJMansfield- $((1+1))> 2예 : $(( ))안에 무엇이 있는지 계산합니다.
Tyilo

3
OP가 C0과 C1을 선택하면 훨씬 더 짧을 것입니다. 그는 프로그래머가 아닌가?
ott--

2
C1과 C2는 실제 실행 명령이 아닌 자리 표시 자라고 확신합니다. :-)
Chris Down

그거 귀엽네. +1
sudo

5

Bash에서 다음과 같이 할 수 있습니다.

$ (( RANDOM%2 == 0 )) && C1 || C2

0 또는 1의 난수를 생성합니다. 0이면 C1이 실행되고 그렇지 않으면 C2가 실행됩니다.

$ (( RANDOM%2 == 0 )) && echo 0 || echo 1
1

$ (( RANDOM%2 == 0 )) && echo 0 || echo 1
0

참고 : 첫 번째 문자 인 $프롬프트가 나타납니다.

또 다른 예

C2가 실행될 수 있도록 C1이 실패해야하는 경우 위와 같이 재구성 할 수 있습니다.

(( RANDOM%2 == 0 )) && CMD=C1 || CMD=C2
$CMD

왜 if / then 문에 이것을 사용합니까?

이 답변은 약간 비난을 받았지만 내 광기에 대한 방법이 있습니다. 이 패턴은 if / then보다 더 모호하게 보일 수 있지만 다음과 같은 작업을 수행 할 때 더 읽기 쉽고 컴팩트합니다.

#!/bin/bash
CMD=""
DIRS="/etc /home /www /data1 /data2 /var/log /var/spool/mail"
FILE="/backup/$(hostname)-$(date +'%m-%d-%y').tar.gz"
[ "$1" == "nas" ]  && CMD="lftp -u user,password -e 'cd /dump/; mput /backup/*; quit' nas.mylan.com" || :
[ "$1" == "scp" ]  && CMD="scp /backup/* scponly@dumpserver:incoming' username" || :
[ "$1" == "tape" ] && CMD='tar -cf /dev/st0 /backup/*' || :
[ "$CMD" == "" ]   && exit 1 || :
# make a backup
tar -zcvf  $FILE $DIRS
# Now depend upon circumstances run a backup command
$CMD

참고 문헌


2
이 실행 C2되면 C1질문에 배치 사양에 위배되는 실패 (즉, 만 것으로, 하나 의 명령이 실행됩니다). x && y || z와 동일하지 않습니다 if x; then y; else z; fi.
Chris Down

@ChrisDown-모드를 참조하십시오.
slm

4
편집은 명목상이 문제를 해결하지만 실제로는 모호합니다. "C2가 실행될 수 있도록 C1이 실패해야하는 경우"시나리오가 전혀 캡처되지 않습니다. 문제는 경우이다 C1때때로 0이 아닌 종료 코드를 반환하는 명령은, 당신이 모두를 실행 끝날 C1하고 C2그렇게되면.
tripleee

+1이지만 ((...))대신 사용 [...]-이중 괄호는 특히 산술 표현식입니다.
glenn jackman

@glennjackman-변경해 주셔서 감사합니다.
slm
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.