2021-03-02
シェルは変数を文字列として取扱い、数値としては考えません。
数字であってもそれは数値ではなく文字として扱われているだけです。
計算処理を行うにはexpr
コマンドを利用します。
整数の計算
掛け算の*
は必ずクォーテーションをつける必要があります。
変数の利用
変数を使って計算させた数値を元の変数に代入する例です。
数値の比較
数値の大小を比較する場合はtest
コマンドが利用できます。
浮動小数点を含む計算
浮動小数点を含む計算を行う場合はbc
コマンドが利用できます。
小数第何位まで出力するかをscale=n
で指定します。
数値かどうかの判定
計算結果(標準エラー出力の結果を標準出力にマージしたもの)
を/dev/null
に捨てます。
$?
はコマンド実行時の終了ステータスを表す関数で、
$NUMBERの値が数値であれば、$?
には終了ステータス0
(計算結果が0の場合のみ1
)が代入されます。
また、$NUMBERの値が数値でなければ、、$?
には2
が代入されます。
上記スクリプトの実行例です。
カラムに対する計算
awk
は1行ずつ行を読み込み処理します。
5番目のカラムの値を足していきます。
ENDの後は、全部の行を処理した後に実行されます。
フィルタを使った文字列処理
echo "$STRING" | sed -e "s/def/xyz/g"
で出力された文字列abc xyz ghi
が
標準出力に出力されますが、その値をSTRINGに再代入しています。
実行した結果をバッククォートで囲むことで、元の変数に代入できます。
文字列の連結
文字列を連結するだけなら変数を並べて書くだけです。
変数+文字列とする場合は中括弧でその変数部分を囲む必要があります。
文字列 + 変数ならば中括弧は不要です。
余計なホワイトスペースの削除
変数にホワイトスペースが混在していても、echoコマンドで出力する際に
シェルが余計なスペースを取り除いてしまうので、余分なホワイトスペースを削除できます。
文字列の長さ
exprコマンドをexpr "string" : '.*'
のように使うと文字列の長さを得られます。
expr
は引数にコロン(:)があると、
右辺と左辺の文字列を比較して先頭から何文字までが等しいかという値を返します。
ただし上記のスクリプトでは、
STRING
にexpr
コマンドで利用する演算子が1文字だけ含まれていた場合、
expr
が演算子だと判断し、エラーとなってしまいます。
case
文で任意の1文字の時のみ分岐をさせると演算子が含まれていても
期待された結果が得られます。
文字列中にある文字列が含まれているか
grep
コマンドは実行終了ステータスとして、
文字列が含まれていたら真、含まれていなければ偽を返します。
それを利用して、文字列中にある文字列が含まれているかの判定が可能です。
grep
の実行結果は/dev/null
に捨てます。
case文を使ってチェックすることも可能です。
文字列の中の一部分の切り出し
パターン | 説明 |
---|
.* | 何もないものを含め、どんな文字列をも表す |
. | 何か1個の文字(ヌル文字にも該当する) |
* | 直前の文字が0個以上並んだ文字列 |
. | ドット文字そのもの |
* | アスタリスクそのもの |
具体的な例 | 説明 |
---|
abc.* | abcで始まる文字列ならなんでも |
.*abc | abcで終わる文字列ならなんでも |
ab*c | acやabbbcというようにaとcの間にbが0個以上ある文字列 |
ab.*c | abで始まってcで終わる文字列 |
a....b | aで始まってbでおわる6文字の文字列 |
..*.c | .cで終わる文字列。.cの前に少なくとも1文字ある。 |
文字列の最初の文字だけを大文字にする
1行で書くと以下となります。
IFS変数
IFSはInternal Field Separatorの略で、値としてはスペースとタブ、改行がIFS変数に
セットされています。
readコマンドの場合
IFS変数の値を:
に置き換えて、/etc/passwd
を読み込んでいます。
ユーザー名とユーザー情報を表示しています。
for文の場合
inの後に指定した文字列を順番に変数に代入して処理します。
その文字列を区切るのはタブかスペースです。
date
コマンドで挙動を確認します。
setコマンドの場合
set
コマンドを--
の引数で実行することで、
その後の文字列を順に位置パラメタの1番からセットします。
awkコマンドの場合
awk
はデフォルトではホワイトスペース(スペースやタブ)を区切り文字として考え、
位置パラメタと同じように$nという形で1個1個の文字列をとらえます。
,
はスペースとして出力されます。
,
を表示させる場合は、"
で括ります。
awk
コマンドの中の$n
はシェルの位置パラメタとは異なるので、
シェルに解釈されないようにシングルクォートで囲む必要があります。
また、区切り文字はF
オプションで指定できます。
cutコマンドの場合
5番目から7番目の文字を取り出します。
デリミタとして:
を指定して、2番目のフィールドを取得します。
ヒアドキュメントからの入力を標準出力へ書き出す例です。
awk
コマンドで位置パラメタの値を任意の文字列の間に表示しています。
%5s
という書式は5桁分の枠をとって右づめにする指定です。
カレントディレクトリのファイルサイズを出力しています。
問い合わせメッセージの出力
echoコマンドで-n
オプションを指定すると、echoの後に改行しません。
ただし、環境によって挙動が異なるので注意が必要です。
例えばMacOSのbash
では想定通り動作しましたがzsh
、sh
では改行されません。
問い合わせに対する応えの取得
1文字だけを読み取る
stty
コマンドでraw
モードにすると入出力のバッファ処理を行わず、
入力したデータがそのまま次のプロセスに渡っていきます。
dd
コマンドは標準入力を標準ん出力にそのままの状態でコピーするコマンドです。
入出力のブロックサイズを1(bs=1
)、
入力のうち1ブロックだけを出力(count=1
)ようにしています。
dd
コマンドで出力されるメッセージはゴミ箱に捨てます。
その後、stty
のモードを元に戻しています。
ある条件下でのメッセージ出力
上記のようにすると何かメッセージを出力するときは必ずif文を書かなくてはなりません。
上記のように、スクリプトの最初にechoコマンドのオプションがない場合に、
ヌルに置き換えてしまうとif文が不要になります。
端末画面のクリア
最近のOSでは単純にclear
でも動作します。
ベルを鳴らす
OSによって異なります。
画面エコーバックのオンオフ
stty -echo
と設定するとエコーバックがなくなり、
入力した文字は画面に表示されません。
UNIX上で動作しているものは全てプロセスと言います。
プロセスには一意のIDが割り当てられており、
OSha実際にはこの番号で処理しています。
ps
コマンドは現在動作しているプロセスの一覧を表示するコマンドです。
grep検索をしたときに、実際にその名前で動作しているものと、このgrep自身の
引数として
basename
basename
コマンドはパスの最後にあるファイルの名前を出力します。
ディレクトリの場合も同じです。
dirname
指定したファイルのあるディレクトリ部分だけを取り出す場合はdirname
コマンド
を使います。
完全パスを得る
ファイルの完全パスを得るには、basename
コマンドと組み合わせます。
ファイルのリスト出力
find
コマンドで、directory下のファイルやディレクトリを全て表示します。
指定したディレクトリ下のファイルを表示します。
完全パスで出力する場合は以下となります。
-type d
オプションでディレクトリのみ表示します。
-type f
オプションでファイルのみ表示します。
-name
オプションで指定した文字列と合致するものだけ表示します。
特殊文字も利用でき、"
で囲みます。
また!
を付けることで、否定ができます。
ディレクトリのコピー
ファイルの日付による操作
ファイルを新しい日付順に表示するには、ls -t
とオプションを指定します。
もっとも新しいファイルを1つ表示するには、
とします。
find
コマンドに-newer
というオプションがあります。
bbb
というファイルがaaa
というファイルより新しい場合の挙動は以下となります。
ファイルのサイズ(大きさ)の調べ方
wc
は-c
オプションを付けるとそのファイルのバイト数を表示します。
一緒にファイル名も表示するので、awk
コマンドで1番目のフィールドを取り出します。
MacOSでMacintoshHDの容量を取得する場合は、以下となります。
OSごとのdf
ファイルの出力が異なるため、環境ごとにsed
、awk
のコマンドについては
考慮が必要です。