यादृच्छिक पर कमांड चलाएं


24

मैं दो में से एक कमांड चलाना चाहता हूं C1और C2यादृच्छिक रूप से। मैं कमांडलाइन (बैश) पर कैसे करूं? सराहना करेंगे अगर एक-लाइनर संभव है।

जवाबों:


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

1
इस बात को ध्यान में रखें कि यदि आप C1 को चलाने के लिए एन बाधाओं में से 1 चाहते हैं, तो आपको शायद (( RANDOM % N == 0 ))इसके बजाय उपयोग करना चाहिए (( RANDOM % N ))। यह केवल N = 2 के विशेष मामले में है कि इनमें समान संभावना है।
एक्यूमेनस

@ABB एक तुलना के बिना ब्लॉकों == 0में निहित है ((, इसलिए मुझे यकीन नहीं है कि आपका क्या मतलब है।
क्रिस डाउन

@ABB == 0मेरी पिछली टिप्पणी में एक टाइपो है, मेरा मतलब > 0निहित है। चूँकि % 100लगभग हमेशा एक मान ऊपर होगा 0, इसलिए यह अपेक्षित है।
क्रिस डाउन

2
RANDOM % $Nबिना किसी व्यावहारिक उपयोग के क्या होगा == 0? IMO, उदाहरण के लिए N = 100 के साथ, यह बहुत अधिक व्यावहारिक है कि 100 ऑड्स == 0में 99 (100 डिलीवर किए गए) की तुलना में 99 में 1 (1 के साथ दिया गया == 0) चाहिए।
एक्यूमेनस

21

आपके विशेष मामले में:

C$((RANDOM%2+1))

काम करेगा :) और हे, यह सबसे छोटा जवाब है!


इसे चारों ओर कोष्ठकों के दो सेटों की आवश्यकता क्यों है? आप जो कुछ भी इस्तेमाल करते हैं उससे मैं बहुत परिचित नहीं हूं।
AJMansfield

2
@AJMansfield $((1+1))-> 2, उदा। $(( ))हिसाब लगाता है कि अंदर क्या है।
टायिलो

3
अगर ओपी ने C0 और C1 को चुना तो यह और भी कम होगा। शायद वह एक प्रोग्रामर नहीं है?
ott--

2
मुझे पूरा यकीन है कि C1 और C2 चलाने के लिए वास्तविक आदेशों के बजाय प्लेसहोल्डर थे। :-)
क्रिस डाउन

वह प्यारा है। +1
सूडो

5

आप बैश में कुछ ऐसा कर सकते हैं:

$ (( 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 / if स्टेटमेंट का उपयोग करें?

इस उत्तर की थोड़ी आलोचना की गई है लेकिन मेरे पागलपन का एक तरीका है। हालाँकि यह पैटर्न एक से अधिक अस्पष्ट लग सकता है यदि / तो मुझे यह अधिक पठनीय और कॉम्पैक्ट लगता है जब निम्न कुछ कर रहा हो:

#!/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
क्रिस डाउन

@ क्रिसडाउन - मॉड देखें।
स्लम

4
संपादित नाममात्र इसे ठीक करता है, लेकिन यह वास्तव में अस्पष्ट है। "यदि आप C1 के फेल होने से चिंतित हैं, ताकि C2 चल सके" तो परिदृश्य पर कोई कब्जा नहीं करता है। मुद्दा यह है कि यदि C1एक कमांड है जो कभी-कभी एक गैर-शून्य निकास कोड लौटाता है, तो आप दोनों को निष्पादित करते समय C1और C2जब ऐसा होता है।
ट्रिपल जूल

+1 लेकिन ((...))इसके बजाय का उपयोग करें [...]- डबल कोष्ठक विशेष रूप से अंकगणितीय अभिव्यक्तियों के लिए हैं।
ग्लेन जैकमैन

@glennjackman - धन्यवाद मैंने बदलाव किया है।
स्लम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.