シェルスクリプト

データ群の列数を自在に調節する(シェルスクリプト)

課題 1列のデータを2列のデータにしたい。具体的には以下のようなイメージ。 $ seq 1 10 1 2 3 4 5 6 7 8 9 10 ↓ 1 2 3 4 5 6 7 8 9 10 解決策 xargs コマンドを利用すれば良い。 $ seq 1 10 | xargs -n 2 1 2 3 4 5 6 7 8 9 10 xargs と言えば、指定したコ…

パイプラインでのデータ喪失の現象に暫定対処する(シェルスクリプト)

課題 パイプラインの中で別のマシンへログインする操作を含む場合、パイプラインを流れているはずのデータが喪失する。 例えば以下のようなスクリプトを考える。 これを実行すると標準出力には1から10までの数値が出力されることが想定される。 seq 1 10 | w…

副作用の影響を局所化する(シェルスクリプト)

課題 解決策 所感 課題 小さい機能を実現するために必要な変更がスクリプト全体へ影響を及ぼしてしまうので気を使う。 例えばカレントを変更したり変数に値を代入したりすることだ。 どのようにすれば影響を局所化することができるのか。 具体例を示す。 カ…

データを処理する(シェルスクリプト)

課題 解決策 データを数える データをソートする 特定のデータを抽出する 特定のカラムについて集計する データを加工したうえで集計する 所感 課題 ターミナル上で大量のデータを処理したい。 例えば、センサーからストリーム出力されるデータをその場でサ…

実行環境によって利用するコマンドを選択する(シェルスクリプト)

課題 ウェブコンテンツをダウンロードするツールとして wget コマンドや curl コマンドが代表的だが、スクリプト実行環境でどちらが利用可能かあらかじめわからない。 このようなときはどのようにスクリプトを記述すれば良いか。 解決策 実行環境で利用でき…

排他制御を実現する(シェルスクリプト)

課題 同時に複数のプロセスが処理をしてはならないクリティカルセクションを用意したい。 シェルスクリプトではどのように排他制御を実現することができるのか。 解決法 mkdir コマンドを利用する。 排他制御と mkdir コマンドには一見して関連がないように…

入力データの追加を監視する(シェルスクリプト)

課題 次々と入力されるデータを監視し、そのデータに対して処理を行いたい。 解決策 tail コマンドの -f オプションを利用する。 これはファイル(または名前付きパイプ)に追加されるデータをリアルタイムで監視して出力するものである。 tail コマンドは P…

ターミナルに蒸気機関車を走らせる(シェルスクリプト)

課題 会議中に暇になったのでターミナルでアニメーションを表示したい。 解決策 sl コマンドを利用する。 sl コマンドはジョークコマンドの一種である。 sl コマンドを実行するとターミナル上にアスキーアートの蒸気機関車が走る。 sl コマンド実行時の様子 …

行番号を付加する(シェルスクリプト)

課題 後続の処理で利用するためにパイプラインを流れるデータに行番号を付加したい。 解決法 以下のような方法がある。 nl コマンドを利用する awk コマンドを利用する sed コマンドを利用する cat コマンドを利用する nl コマンドを利用する nl コマンドは…

個人のエイリアス設定を回避する(シェルスクリスプト)

課題 作成した環境とは別の環境で、あるシェルスクリスプトを起動したとき、うまく実行されなかった。 どうやら実行環境のエイリアス設定が影響しているようだ。 例えば .bashrc で以下のようなエイリアスが設定されている。 alias rm='rm -i' rmコマンドで …

「何もしない」コマンドを利用する(シェルスクリプト)

課題 ヌルコマンドという何もしないらしいコマンドの存在理由がわからない。 解決法 ヌルコマンド(:)は、呼び出しても何も実行せず、"たいていは"成功を返すコマンドである(失敗させる実行方法は今回は述べない)。 ヌルコマンドはその特異性により実は…

簡易的に条件分岐する(シェルスクリプト)

課題 複雑ではない条件分岐のために毎回 if 文を記載するのが面倒くさい。 他に条件分岐する方法は無いのか。 解決法 && リストを利用する。 && リストはもともと左右両方のコマンド(パイプライン)が成功したときに成功を返すことを表現する構文である。 …

簡易的に引数をチェックする(シェルスクリプト)

課題 例えば個人的に利用するようなスクリプトでは、厳格な引数チェックを行う必要はないだろう。 一方で、明らかな誤りを弾くために、ある一定のレベルでは引数チェックを行いたいときがある。 どのような引数チェックができるのか。 解決法 引数の数をチェ…

標準入力の内容を逆順に出力する(シェルスクリプト)

課題 標準入力を逆順に出力する方法をたくさん知りたい! 入力例は以下とする。 $ seq 1 10 1 2 3 4 5 6 7 8 9 10 解決法 tac を使う 言わずとしれたコマンド。 GNU coreutilsに含まれる。 コマンド名は cat の逆順に由来。 もちろん POSIX 非規定なので注意…

見通しよくファイルの一覧を確認する(シェルスクリプト)

課題 ls コマンドでファイルの一覧を確認するとき、ファイルの数やファイル名の長さによって表示がまちまちになり、分かりづらい。 $ pwd / $ ls Applications Users cores home sbin var Library Volumes dev opt tmp System bin etc private usr 解決法 ls…

「それ」を解釈するのは誰?(シェルスクリプト)

課題 以下のようなディレクトリ構造を考える。 $ tree . ├── dirl1 │ ├── dirl2 │ │ └── scriptl2.sh │ └── scriptl1.sh └── scriptl0.sh このディレクトリを再帰的に探索して、すべてのシェルスクリプトのファイル(拡張子が.shのファイル)を出力するため…

スクリプト名を取得する(シェルスクリプト)

デバッグ等の目的でスクリプト名を取得して出力したい状況はしばしば発生する。 シェルスクリプトでは$0を参照することでスクリプト名を取得することができる。 例えば以下のようなスクリプトを作成する。 $ cat testscript.sh #!/bin/sh echo $0 このスクリ…