(1) s1 = s2 s1 と s2 が同一 (2) s1 != s2 s1 と s2 が同一でない (3) s1 < s2 作成中 (4) s1 > s2 作成中 (5) -n s1 s1 が null でない(一文字以上を含んでいる) (6) -z s1 s1 が null である
ふたつの文字列を比較する
#!/bin/bash
S1='string'
S2='String'
if [ $S1=$S2 ];
then
echo "S1('$S1') is not equal to S2('$S2')"
fi
if [ $S1=$S1 ];
then
echo "S1('$S1') is equal to S1('$S1')"
fi
ここで、上記の if [ $1 = $2 ]
に関して Andrea Beck が送ってくれた
メールの一文を引用します。
あまりいい考えとは言えません。もし、$S1 か $S2 のどちらかが空の場合、 パーサエラーになるからです。x$1=x$2 か "$1"="$2" としたほうがよいで しょう。
+ - * / % (剰余)
-gt ( > ) -le ( <= ) -ge ( >= ) -eq ( == ) -ne ( != )
C プログラマが使っている演算子についても、丸カッコを付けて対応関係を示しまし た。
このセクションは Kees (謝辞を見てください)によってリライトされたものです。
以下のコマンドのなかには、完全なプログラミング言語を内包しているといえそう なものもあります。それらのコマンドを取り上げて、基本的用法だけを説明しよと 思います。詳細な解説については、コマンドのマニュアルページをみてください。
sed
はノン・インタラクティブなエディタです。カーソルを画面上で動かし
ながらファイルに変更を加えるかわりに、編集に関する指示と編集すべきファイル名
を書き込んだスクリプトを使用します。また、sed
は一種のフィルタである
と考えることもできます。いくつか例を見てみましょう。
$ sed 's/to_be_replaced/replaced/g' /tmp/dummy
上記において、sed
は、/tmp/dummy
というファイルを読み込ん
で、文字列 "to_be_replaced
" を文字列 "replaced
" に置換しま
す。その結果は標準出力(通常はコンソール)に出力されますが、上記コマンドライン
の末尾に(例えば) '> capture
' と付け加えるなら、 "capture
"
という名前のファイルに sed
の出力結果を送ることもできます。
$ sed 12, 18d /tmp/dummy
上記の例で、sed
は 12
から 18
行目までを除く全ての
行を表示します。このコマンドによって元のファイルに変更が加えられることはあり
ません。
AWK
プログラミング言語には多くの実装が存在します。(最も有名なイン
タープリタは、GNU の gawk
と「新しい awk
」 である
mawk
です。)
AWK
の原理は単純です。パターンを探して、合致したパターン(pattern)全
てに対してなんらかの処理(action)を行うということです。
再度、以下のような行を含むダミーファイルを作りました。
test123 test tteesstt
$ awk '/test/ {print}' /tmp/dummy
test123
test
上記において、AWK
が探そうとしたパターン(pattern)は "test
"
であり、/tmp/dummy
ファイルの行の中から "test
" という文字列
を探し出したときに行った処理(action)が画面への表示 "print
" です。
$ awk '/test/ {i=i+1} END {print i}' /tmp/dummy
3
数多くのパターンを探そうとしているときは、クオテーション('')で囲まれた文字列
を(例えば) '-f file.awk
' といったファイル名で置き換えます。
そうすれば、すべてのパターンと処理を 'file.awk
' というファイルに書き
込んで、まとめて実行できます。
grep
コマンドの、あるパターンに合致する行を表示する機能については、
これまでの章でいくつも見てきたと思います。しかし、grep
の機能はそれ
だけではありません。
$ grep "look for this" /var/log/messages -c
12
上記の例は、"look for this
" という文字列が /var/log/messages
ファイルのなかで 12
回見つかったことを意味し
ています。
[ OK, この例題はフェイクなんだ。/var/log/messages
にちょっと手を加え
といたのさ。 :-)]
以下の例題では、出力が期待通りになっていないのが分かると思います。この例題で 使われたダミーファイルには(前に使った内容とは異なる)次のような文字列が含まれ ていたからでらす。
bash introduction howto test file
$ wc --words --lines --bytes /tmp/dummy
2 5 34 /tmp/dummy
wc
ではパラメータ指定の順番は自由ですが、それらの出力時の順番はいつも
決まっています。上記のように、行数、語数、バイト数、ファイル名 の順番に
なります。
今回のダミーファイルの内容は次のようになっています。
b c a
$ sort /tmp/dummy
次は、そのアウトプットがどう表示されるかです。
a
b
c
コマンドを使うとすると、これほど簡単にはいかないでしょう。
bc
はコマンドラインで操作するよくできた計算プログラムです。リダイレク
トやパイプからは入力できませんが、ファイルからの入力が可能で、ユーザインター
フェイスもあります。以下では、そのコマンドの中からいくつかを実際にデモンスト
レーションしてみます。なお、bc
起動時に -q
パラメータを使用
しているのは、起動時にウェルカムメッセージを出力させないためです。
$ bc -q
1 == 5
0
5 != 5
0
2 ^ 8
256
sqrt(9)
3
while (i != 9) { i = i + 1; print i }
12345689
quit
tput
でなにができるか、簡単に紹介します。
$ tput cup 10 4
上記の例では、プロンプトが (y10,x4)
の位置にあらわれます。
$ tput reset
上記では、画面をもとに戻して、(y1,x1)
の位置にプロンプトを表示しま
す。(y0,x0)
がちょうど左上の隅にあたる位置です。
$ tput cols
80
上記では、X
軸方向に文字がいくつ並ぶのかを表示しています。
(少なくとも)上記のようなプログラムについては、使い慣れておくことを強くお薦め します。コマンドライン上の操作で驚くほどの処理をしてくれる小さなプログラムは 無数にあります。
[例題のいくつかは、マニュアルページや FAQ から取りました。]