क्या किसी भी समय किसी भी कमांड को दोहराने के लिए एक मानक UNIX टूल है?


13

यह शायद आसान मर चुका है, लेकिन कंसोल में एक बार कमांड लिखने का एक सरल तरीका है, और क्या यह nकई बार निष्पादित किया गया है, जहां nरनटाइम पर निर्दिष्ट किया गया है? कुछ इस तरह:

repeat 100 echo hello

क्या ऐसी कमांड मौजूद है (विशिष्ट लिनक्स इंस्टॉलेशन मान लें)

या मैं बैश में किसी तरह का लूप करने के लिए लिखूंगा?

जवाबों:


23

हाँ यह संभव है। बैश में एक बहुत व्यापक स्क्रिप्टिंग भाषा है। इस मामले में:

for i in {1..100}; do echo 'hello'; done

अधिक लूपिंग उदाहरण: http://www.cyberciti.biz/faq/bash-for-loop/
पूर्ण बैश संदर्भ: http://www.gnu.org/software/bash/manual/bashref.html


जब आदेश विफल हो जाता है तो क्या होता है?
माज़ा

आपकी त्रुटि हैंडलिंग इसे पकड़ लेती है और इसके बजाय क्या करना है, इस पर काम करती है।
Xyon

मैंने कोशिश की for i in {1..100}; do python3 foo.py ; doneऔर वास्तव में निष्पादन समय प्राप्त करने का मतलब है (यह देखने के लिए कि कितनी तेजी से) time for i in {1..100}; do python3 foo.py ; doneऔर फिर CTRL-C लूप को रोक नहीं पाएगा
nonopolarity

3

या मैं बैश में किसी तरह का लूप करने के लिए लिखूंगा?

हाँ, आप इस तरह चाहेंगे:

for(( i = 0; i < 100; i++ )); do echo "hello"; done

या, छोटा:

for((i=100;i--;)); do echo "hello"; done

और फिर उस सामान को फंक्शन और वॉयला में डाल दें, आपके पास आपकी कमांड है: रिपीट () {for_stuff_here; "$ @" करें; किया}
अकीरा

3

अधिक निर्मित विधियों के अलावा आप बाहरी उपयोगिता का उपयोग कर सकते हैं जो संख्याओं का एक क्रम उत्पन्न करता है।

# gnu coreutils provides seq
for i in $(seq 1 100) ; do printf "hello\n" ; done

# freebsd (and probably other bsd) provides jot
for i in $(jot - 1 100) ; do printf "hello\n" ; done

3

लूप सिंटैक्स के लिए मूर्खतापूर्ण है। यह छोटा है:

seq 10|xargs -I INDEX echo "print this 10 times"

2

मुझे यह काम करने के लिए "मानक" लिनक्स टूल नहीं मिला, लेकिन मैं आमतौर पर स्थापना से लेकर इंस्टॉलेशन तक अपनी डॉट फाइलें (.bashrc, .vimrc आदि) संरक्षित करता हूं, इसलिए यदि आप इसे देखते हैं, तो निम्न "मानक" है। नई स्थापनाओं में अपनी डॉट फ़ाइलों को संरक्षित करने का परिप्रेक्ष्य:

अपने .bashrc या .bash_aliases के अंत में, निम्नलिखित परिभाषा डालें:

repeat() {
  n=$1    #gets the number of times the succeeding command needs to be executed
  shift   #now $@ has the command that needs to be executed
  while [ $(( n -= 1 )) -ge 0 ]    #loop n times;
  do
    "$@"    #execute the command; you can also add error handling here or parallelize the commands
  done
}

फ़ाइल को सहेजें और या तो खोल को फिर से खोलें या निष्पादित करें source /path/to/.bashrcया source /path/to/.bash_aliases, जो भी आप मौजूदा शेल में संशोधित करना चाहें।

बस! आपको निम्नलिखित तरीके से इसका उपयोग करने में सक्षम होना चाहिए:

repeat 100 echo hello

repeat 84 ~/scripts/potato.sh

आदि।


अच्छा। "वैरिएबल" को n = $ 1 के सामने रखना अच्छा होगा, वैश्विक वैरिएबल नेमस्पेस को प्रदूषित करने से बचने के लिए
डॉन हैच

0

वर्तमान में, अन्य उत्तरों में से कोई भी मानक यूनिक्स टूल का उपयोग नहीं कर रहा है जो कि शीर्षक प्रश्न पूछ रहा है।

वे सभी या तो गैर मानक कमांड ( seqया jot) या शेल एक्सटेंशन (C- स्टाइल forलूप या ब्रेस एक्सपेंशन) का उपयोग करते हैं, यानी वे सभी POSIX मानक के साथ चिपके रहते हैं।

यहाँ एक पोर्टेबल तरीका है जो किसी भी POSIX अनुरूप शेल और ऑपरेटिंग सिस्टम के साथ काम करना चाहिए:

for i in $(awk 'BEGIN {for(i=0;i<100;i++) print i}'); do echo hello; done
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.