এলোমেলোভাবে কমান্ড চালান


24

আমি দুটি কমান্ডের মধ্যে একটি C1এবং C2এলোমেলোভাবে চালাতে চাই । কমান্ডলাইন (বাশ) এ আমি কীভাবে করব? ওয়ান-লাইনার সম্ভব হলে প্রশংসা করবে।

উত্তর:


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

1
মনে রাখবেন যে আপনি যদি সি 1 চালানোর জন্য এন প্রতিক্রিয়াগুলিতে 1 চান, আপনার সম্ভবত এটির (( RANDOM % N == 0 ))পরিবর্তে অবশ্যই ব্যবহার করা উচিত (( RANDOM % N ))। এটি কেবলমাত্র এন = 2 এর বিশেষ ক্ষেত্রে এটির অভিন্ন সম্ভাবনা রয়েছে।
একিউম্যানাস

@ == 0এ বি বি ((কোনও তুলনা ছাড়াই ব্লকগুলিতে অন্তর্ভুক্ত, সুতরাং আপনার অর্থ কী তা আমি নিশ্চিত নই।
ক্রিস ডাউন

@ == 0এ বি বি আমার পূর্ববর্তী মন্তব্যে একটি টাইপো, আমি বোঝাতে চাইছি > 0অন্তর্নিহিত। যেহেতু % 100প্রায় সবসময় উপরে একটি মান ফেরত আসবে 0, এটি প্রত্যাশিত।
ক্রিস ডাউন

2
সাধারণভাবে বলতে গেলে, ব্যবহারিক ব্যবহার RANDOM % $Nছাড়া == 0কী হবে ? আইএমও, উদাহরণস্বরূপ এন = 100 এর সাথে == 0100 এর মধ্যে 99 টি (ছাড়াই বিতরণ করা ) এর চেয়ে 100 এর মধ্যে 1 টি (বিতরণ করা ) হওয়া 1 এর চেয়ে অনেক বেশি বাস্তববাদী == 0
একুম্যানাস

21

আপনার বিশেষ ক্ষেত্রে:

C$((RANDOM%2+1))

কাজ করবে :) এবং আরে, এটি সবচেয়ে সংক্ষিপ্ত উত্তর!


এর চারপাশে কেন এটি দুটি সেট বন্ধনী প্রয়োজন? আপনি যা ব্যবহার করেছেন তার সাথে আমি খুব বেশি পরিচিত নই।
এজেম্যানসফিল্ড

2
@ আজেমানসফিল্ড $((1+1))-> 2, যেমন। $(( ))ভিতরে কি আছে তা গণনা করে।
Tyilo

3
এটি অপেক্ষাকৃত ছোট হবে যদি ওপি সি0 এবং সি 1 পছন্দ করে। সে কি প্রোগ্রামার না?
অট--

2
আমি নিশ্চিত যে সি 1 এবং সি 2 চালানোর আসল কমান্ডের চেয়ে স্থানধারক ছিল pretty :-)
ক্রিস ডাউন

ওটা সুন্দর. +1
sudo

5

আপনি বাশে এ জাতীয় কিছু করতে পারেন:

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

এটি 0 বা 1 হয় একটি এলোমেলো সংখ্যা জেনারেট করে, যদি এটি 0 হয় তবে সি 1 চালায়, অন্যথায় সি 2 যদি এটি না হয় তবে চালায়।

উদাহরণ

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

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

দ্রষ্টব্য: প্রথম চরিত্রটি $হ'ল প্রম্পট।

আরেকটি উদাহরণ

যদি আপনি সি 1 নিয়ে ব্যর্থ হন যাতে সি 2 চালাতে পারে তবে আপনি উপরের মত পুনর্গঠন করতে পারেন:

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

কেন / যদি বিবৃতিতে এটি ব্যবহার করবেন?

এই উত্তরটি কিছুটা সমালোচিত হয়েছে তবে আমার উন্মাদনার একটি পদ্ধতি আছে। যদিও এই প্যাটার্নটি যদি / এর চেয়ে বেশি অস্পষ্ট মনে হয় তবে নীচের মতো কিছু করার সময় আমি এটি আরও পঠনযোগ্য এবং কমপ্যাক্ট বলে মনে করি:

#!/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
ক্রিস ডাউন

@ ক্রিসডাউন - মোডগুলি দেখুন।
slm

4
সম্পাদনা নামমাত্র এটি স্থির করে, কিন্তু এটি সত্যিই অস্পষ্ট। "যদি আপনি সি 1 নিয়ে ব্যর্থ হন যাতে সি 2 চালাতে পারে সে সম্পর্কে উদ্বেগ থাকলে" দৃশ্যটি মোটেই ক্যাপচার করে না। সমস্যাটি হ'ল যদি C1এমন কোনও কমান্ড হয় যা কখনও কখনও শূন্য-বহির্গমন কোডটি দেয় তবে আপনি উভয়ই কার্যকর করবেন C1এবং C2যখন তা ঘটে।
ট্রিপলি

+1 এর ((...))পরিবর্তে ব্যবহার করুন [...]- ডাবল বন্ধনী বিশেষত গাণিতিক এক্সপ্রেশনগুলির জন্য।
গ্লেন জ্যাকম্যান

@glennjackman - ধন্যবাদ আমি পরিবর্তন করেছি।
slm
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.