理系学生日記

おまえはいつまで学生気分なのか

忍者TOOLS

shell

declare、typeset、そして local

declare とか typeset、local まわりの使い方について。 まず、declare と typeset は、シノニムなので、この 2 つの差異は考えなくて良いと思います。このため、ここでは declare でひとまとめにして扱いたいと思います。 そういうわけで、declare と local…

シェルスクリプトで部分文字列を切り出す

ときどき、シェルスクリプトで文字列の 3 文字目から 4 文字を切り出したいみたいなユースケースがあって、これまでずっと cut でやってた。 $ echo $str 1234567890 $ echo $str | cut -c3-6 3456 これ、じつは文字列操作でできる。 $ echo ${str:3:4} 4567…

シェルスクリプトにおける [ と [[

シェルスクリプトで条件分岐を書くとき、[ を使ったり [[ を使ったりすることになると思います。 POSIX の test にも記載がありあすが、[ は test と同じ機能を持つことになっており、同じ実装であることも多いです (ただし、[ として実行されるか、test と…

BashのGlobに関わるオプション

前に Bash の Glob に関するエントリを書きました。 他にも Glob には様々な応用があります。 あまり知られていないような使い方も多いので、それらをご紹介していくコーナーです。 extglob Glob で正規表現と not 条件を表現できるようになる。 詳細につい…

BashのGlobは積極的に利用しましょう

bash には glob というものがあります。glob ってなによっていう人も ls *.sh とかを展開する bash の機能ですよっていうと分かるかと思います。 この glob の機能って多用されますがあまりマニュアルとか読んだ人もいないと思うので、簡単にまとめてみます…

シェルスクリプトでのtrapの使い方

シェルスクリプトでシグナルをトラップするには、みたいなことを考えることがあって、そういえば trap という日頃なかなか思い出されない不憫なビルトインがあることを思い出しました。trap は bash のビルトインとして存在する便利なヤツですが、忘れられが…

シェルスクリプトでテンプレート処理 (envsubstの使い方)

シェルスクリプトで、テンプレート処理を行いたいというケースがあります。 ここでいうテンプレート処理というのは、例えば以下のようなテンプレート(ここでは template.tt と呼びます)があった場合に、 || property1=${hoge} property2=${fuga} ||< これを…

シェルスクリプトでの IP アドレス計算

まぁ、ipcalc 使いましょう。initscripts に含まれてるので、基本つかえるとおもいます。 |tcsh| $ rpm -qf which ipcalc initscripts-9.03.40-2.el6.centos.1.x86_64 ||< ブロードキャストアドレスやネットワークアドレスは次のようにして計算できます。 |t…

シェルスクリプトのバッドパターン

シェルスクリプトでバッチ組んだけど性能が出ません、止まってるように見えます、みたいな相談を受けた。 大量のデータを扱うバッチだったので DB 処理待ちになっているもんだと思っていたのだけれど、状況を調べてみると DB サーバ側の負荷はまったくなく、…

Bash のプロセス置換が便利な件

Bash にはプロセス置換という便利な機能があります。しかしこの機能、あまり知名度が高くない。 ぼくは毎日の労働に疲れ果てているし、日本学生支援機構という組織から毎月金を請求され、しまいには信用情報機関に登録される寸前までいくような生活を送って…

スクリプトに出てくる${1+"$@"}

時々、スクリプトを見ていると ${1+"$@"} なんて記述にでくわす。例えば、これは Perl スクリプトだけれど、cpanm の実装では |perl| !/Users/kiririmode/perl5/perlbrew/perls/perl-5.14.1/bin/perl eval 'exec /Users/kiririmode/perl5/perlbrew/perls/per…

条件分岐での複文実行

オシャレかどうかは個人の趣向によるのだけれど、あんまし大した条件分岐でもないのに if/else 文を書くというのは行き過ぎだろと思うときが結構ある。こういうときは短絡評価させる、みたいな方が分かりやすくて良いかなと思っていた。 単純な例を書く。 |t…

シェルスクリプト面白挙動

**こんなのつくる. |zsh| !/bin/bash cat myfile | while read line do exit 2 done echo "out of loop" ||< **myfile はこんな感じ |zsh| $ perl -e 'print map { "$_\n" } "a" .. "z"' > myfile ||< **実行する |zsh| $ ./test.sh out of loop ||< おーー…