コマンドをランダムに実行する


24

私は2つのいずれかのコマンドを実行するC1C2ランダムにします。コマンドライン(bash)でそれを行うにはどうすればよいですか?ワンライナーが可能であれば感謝します。

回答:


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

1
C1を実行するN分の1が必要な場合(( RANDOM % N == 0 ))は、おそらくを使用する必要があります(( RANDOM % N ))。これらが同じ確率を持つのは、N = 2の特別な場合のみです。
Acumenus

@ABB == 0((ブロックなしで暗黙的に比較されないため、何を意味するのかわかりません。
クリスダウン

@ABB == 0は私の以前のコメントのタイプミスであり、> 0暗黙的です。% 100ほとんどの場合、上記の値が返されるため、それは0予期されていることです。
クリスダウン

2
端的には、実用化がどうなるかで、入れRANDOM % $Nなくて== 0?IMO、たとえばN = 100の場合、100オッズで== 099(オッズなしで配信)よりも100オッズで1(オッズで配信== 0)が必要です。
Acumenus

21

特別な場合:

C$((RANDOM%2+1))

動作します:)そして、ちょっと、それは最短の答えです!


なぜ2組の括弧が必要なのですか?私はあなたが使用したものにあまり精通していません。
AJMansfield

2
@AJMansfield- $((1+1))> 2など。$(( ))中身を計算します。
ティロ

3
OPがC0とC1を選択した場合、さらに短くなります。たぶん彼はプログラマーではないのでしょうか?
ott--

2
C1とC2は、実際に実行するコマンドではなく、プレースホルダーであると確信しています。:-)
クリスダウン

それはかわいいです。+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

注:最初の文字$、はプロンプトです。

もう一つの例

C1が失敗してC2を実行できるようにする必要がある場合は、上記のように再構築できます。

(( 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
これはC2C1失敗した場合に実行され、質問で指定された仕様に違反します(つまり、コマンドの1つのみが実行されます)。x && y || zはと同等ではありませんif x; then y; else z; fi
クリスダウン

@ChrisDown-MODを参照してください。
slm

4
編集は名目上これを修正しますが、それは本当にあいまいです。「C1が失敗してC2を実行できるようにする必要がある場合」は、シナリオをまったくキャプチャしません。問題はC1、コマンドがゼロ以外の終了コードを返すことがある場合、両方が実行されることにC1なりC2、それが発生した場合です。
トリプリー

+1であるが、((...))代わりに使用する[...]-二重括弧は、算術式専用です。
グレンジャックマン

@glennjackman-ありがとう、私は変更を加えました。
slm
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.