本を読む

読書やコンピュータなどに関するメモ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

「1から100の整数ただし5つの異なる方法」 by bash

 「forやめろ」というプレゼンで、「1から100の整数を出力してください ただし5つの異なる方法を用いて」という話があったので、bashのシェルスクリプトで試してみました。

 まあ、気ばらしです。環境はLinuxです。

コマンド一発系

 実際のところ、seqで一発なんですが(MacやBSDではjot)。実際の場面で、表示するだけならこれ一択。

#!/bin/bash
seq 100

 シーケンス式({x..y}の式)で連番を作れますが、echoするとスペース区切りになるので、trで改行区切りに。

#!/bn/bash
echo {1..100} | tr ' ' '\n'

 printfコマンドは引数が残っている限りパターンを繰り返すので、それを使って1コマンドで処理。

#!/bn/bash
printf '%d\n' {1..100}

 100行の空行をnlでナンバリングするという手もあります。

#!/bin/bash
yes '' | head -n 100 | nl -ba -nln

ループ系

 元のプレゼンでいうforに近いやつ。

#!/bn/bash
for (( i = 1; i <= 100; i++ )); do
    echo $i
done

 シーケンス式とforの組み合わせ。ほかの言語でいうforeachとかeachとかに近いかな。

#!/bn/bash
for i in {1..100}; do
    echo $i
done

 最初のforと同じようなことをwhileで書いてみます。

#!/bn/bash
i=0
while (( i <= 100 )); do
    echo $((i++))
done

 これを数値演算を使わないでやると、こんな感じで。

#!/bn/bash
s=x
while [ ${#s} -le 100 ]; do
    echo ${#s}
    s=x$s
done

再帰系

 ループは再帰で表現できますね。

#!/bn/bash
f () {
    echo $1
    (( $1 < 100 )) && f $(($1 + 1))
}

f 1

 シェル関数を使わず、自分自身を再帰的に呼び出してみます。

#!/bn/bash
i=${1:-1}
echo $i
(( i < 100 )) && exec $BASH $0 $((i + 1))

その他

 dcによる方法。

#!/bin/bash
dc -e '[p1+d100!<a]sa1lax'

 sedからexprを呼んで次の数を作っていく方法。

#!/bin/bash
echo 1 | sed ':a
H
s/.*/expr & + 1/e
/101/!ba
g'

 無限ループを走らせて、コマンド実行をトリガーに、カウントと表示をする方法。

#!/bin/bash
i=1
trap 'echo $((i++)); (( i > 100 )) && exit' DEBUG
while :; do :; done

 /etcの下にあるファイルから数字を拾ってくる方法。

#!/bin/bash
{grep -ohsrI '[1-9]' /etc; grep -ohsrI '[1-9][0-9]' /etc;} | sort -nu
echo 100

 カウンター変数を使わないでループする方法。100秒かかります。

#!/bin/bash
while [ $SECONDS -ne 100 ]; do
    sleep 1
    echo $SECONDS
done

コメント

コメントの投稿

管理者にだけ表示を許可する

トラックバック

http://emasaka.blog65.fc2.com/tb.php/1260-9bc115b1

 | HOME | 

Categories

Recent Entries

Recent Comments

Recent Trackbacks

Appendix

emasaka

emasaka

フリーター。
連絡先はこのへん

Monthly


FC2Ad

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。