2017-05-01から1ヶ月間の記事一覧
Bashには二次元配列はもちろんありません。それらしいことを実現するにはかつてのPerl4のように例えばカンマで区切るようなことをしなければなりません。 #!/bin/bash N=$1 table=() for y in `seq 1 $N`; do b=() for x in `seq 1 $N`; do b+=($((x*y))) do…
Bashに配列はあります。ただ、とても遅いです。 white spaceで区切って()で括ると配列になります。 #!/bin/bash a=(1 2) a+=(3) echo ${a[@]} # 1 2 3 a+=(3)は、見た通り要素を追加しています。 これは本当に追加なのでしょうか。多くの要素を追加して、経…
前回はパイプを使ったのですが、結局ラムダが使えないので中途半端なんですよね。takewhileやfilterを汎用の関数にできないのです。 しかし、evalを使うとラムダっぽいことができます。 a=1 b=c eval $b=\$a echo $c # 1 evalは、c=$aという文字列をコマンド…
前回は、フィボナッチ数列を垂れ流すだけのfibsを使いたいが、fibsが終わらないと次に進まないのでできないという話でした。 しかし、Linuxにはパイプというものがあったはずです。これならfibsがある程度進めば、その下流の関数が動き出すはずです。そこで…
関数fは次のように定義します。 [function] f() { ... } 関数の値の返し方には2種類あります。 is_even() { n=$1 return $((n%2)) } 引数は、$1、$2に格納されます。そして、returnで返します。 返せる値は0〜255の整数に限られているので、上のように、叙述…
if文を使えるようになると、Problem 1が解けます。if文は、 if ...; then ... elif ...; then ... else ... fi という形式になっています。ifの行は、例えば次のようです。 #!/bin/bash if [ 1 -lt 2 ]; then echo 1 fi -ltはless thanを意味していて、1は2…
Problem 1を前回のように包除原理で解くのはプログラミングの問題としてはやや邪道です。ループを回す方法を考えてみましょう。 while/untilを使うことも使うことも可能ですが、やはりforを使うほうがフローが分かりやすいでしょう。forには2種類あります。…
Bash on Ubuntu on Windowsをインストールしたので、Project EulerをBashで解いてみました。 元々、WindowsのPythonで64ビット整数を扱おうとすると多倍長整数になってしまい32ビットの範囲で計算しているときよりかなり遅いという問題がありました。Linux版…