コマンドを何度でも繰り返す標準的なUNIXツールはありますか?


13

これはおそらく非常に簡単ですが、コンソールで一度コマンドを記述し、実行n時間をn指定して、実行時に指定する簡単な方法はありますか?このようなもの:

repeat 100 echo hello

そのようなコマンドは存在しますか(典型的なLinuxインストールを想定していますか)?

または、bashで何らかのループを行うために書くでしょうか?

回答:


23

はい、これは可能です。Bashには非常に広範なスクリプト言語があります。この場合:

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

その他のループ例:http : //www.cyberciti.biz/faq/bash-for-loop/
完全なbashリファレンス:http : //www.gnu.org/software/bash/manual/bashref.html


コマンドが失敗するとどうなりますか?
maazza

エラー処理はそれをキャッチし、代わりに何をすべきかを解決します。
Xyon

私はfor i in {1..100}; do python3 foo.py ; done実際に実行時間を取得することを試みました(どれくらいの速さを確認する)time for i in {1..100}; do python3 foo.py ; doneと、CTRL-Cはループを停止できません
非極性

3

または、bashで何らかのループを行うために書くでしょうか?

はい、あなたはこのようにしたいと思います:

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

または、より短い:

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

そして、そのようなものを関数と出来上がりに入れると、あなたのコマンドがあります:repeat(){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


2

この仕事をするための「標準の」Linuxツールは見つかりませんでしたが、通常、インストールからインストールまでドットファイル(.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/.bashrcsource /path/to/.bash_aliases、またはを選択して、変更を選択します。

それでおしまい!次の方法で使用できるはずです。

repeat 100 echo hello

repeat 84 ~/scripts/potato.sh


いいね グローバル変数の名前空間汚染を避けるために、N = $ 1の前に「ローカル」に置くのが良いでしょう
ドンハッチ

0

現在、他の答えはどれもタイトルの質問が求めている標準のUnixツールを使用していません。

それらはすべて非標準コマンド(seqまたはjot)またはシェル拡張(Cスタイルforループまたはブレース拡張)のいずれかを使用します。つまり、すべてPOSIX標準に固執しません。

POSIX準拠のシェルとオペレーティングシステムで動作する移植可能な方法を次に示します。

for i in $(awk 'BEGIN {for(i=0;i<100;i++) print i}'); do echo hello; done
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.