🐲

シェルスクリプトの基礎④~if文~

2021/01/10に公開1

はじめに

くーばねてすをやっつけるためにLinuxさんと仲良くさせていただいているが、Linuxさんにはシェルのコマンドを格納しておくシェルスクリプトというファイルがあるらしいのでそれをまとめてみた。

概要

シェルスクリプトの制御構造の
■シェルスクリプトの制御構造とは
■if文

をまとめた!

■シェルスクリプトの制御構造とは

まって!('_')制御構造って誰!?なにを制御しちゃうの!?コンピューター!?

bashのシェルスクリプトはふつうのプログラミング言語のように値による条件分岐や繰り返し処理を行うことができる。
制御構造を実行するのには、if,for,case,whileなどの複合コマンドを使用する。
if 文は条件式に指定されたコマンドの終了ステータスを判定し分岐を行う。終了ステータスが「0」の場合は真、その他の場合は偽となる。

■if文

if 文とは、指定した条件が合っているときのみ処理を行い、それ以外の場合は処理をスキップする、などといった場合の条件分岐処理ができる。

↓if文条件式書式

if条件式書式
if [ 条件 ] ;then    (条件にあう時は...)(※スペース注意!)
	条件の結果が真であるときの処理
else   (もし違ってれば...)
	条件の結果が偽であるときの処理
fi       (!?)

まって!fiってなに!?フィっ!!??(@_@)fiの意味何!?
※fiってとじるって意味らしい。

↓コマンドラインの引数がsuidouならOKと表示する、といった条件指定をしてみる。

suidou→OK
$ cat if_suidou.sh
#! /bin/bash
if [ "$1"="suidou" ];then     (←※こいつ、スペースがいるから気を付けて!)
	echo "OK"
else
	echo "NG"
fi              (フィ!!!)

$ ./if_suidou.sh  suidou
OK               (できた!)

※注意!※
私も一瞬できなかったんだけど、条件にいちいちスペースをはさむのを忘れずに!(@_@)

 ↓ここ      ↓ここ
[ "$1"="suidou" ]   (OK)
["$1"="suidou"]       (NG)
["$1" = "suidou"]     (NG)

あと ; も忘れずに!

if [ "$1" = "suidou" ];then     (OK)
if [ "$1" = "suidou" ]then     (NG) 
;付けたくない時は
if [ "$1" = "suidou" ]
then 
のように改行してください!!!

ifの後ろは必ずコマンドを置く。

他のプログラミング言語では普通に条件に記述していくが、シェルスクリプトの場合は違うらしい!
コマンドしか置いちゃいけないんだって!
うそだろ!さっき私条件がっつり書いたけど!(@_@)
↓if文基本の書式

if コマンド1;then     
	条件1の結果が真であるときの処理
elif コマンド2
	条件2の結果が真であるときの処理
elif コマンド3
	条件3の結果が真であるときの処理
else                 (もしみんな違ってれば...)
	上記の結果がみんな偽である時の処理
fi

どういうこと!?(@_@)
実はゼロ思考でさっき書いていた

[ "$1" = "suidou" ]

こいつの[]が、こいつがコマンドだったそうなのだ!

$ type [
[ is a shell builtin   (※組み込みコマンドです)

なのでさっきのは [ ]はコマンドで、その中に条件式を書いていたということだ。

だから[ "$1"="suidou" ]のように[]の間にスペースを空ける必要があったのだな!!!

コマンドと終了ステータス

「if 文は条件式に指定されたコマンドの終了ステータスを判定し分岐を行う。終了ステータスが「0」の場合は真、その他の場合は偽となる。」
らしい('_')
なんだそりゃ!どういうこと?

lsやgrepなどのコマンドには全て終了時に終了ステータスという整数値が返される。
...?見たことないんだけど('_')

終了ステータスを参照するには

$ echo $?

で直前のコマンドの終了ステータスが参照することができる。
正常に終了した場合は整数値は0,エラー時には0以外の値が返される。

$ ls         (コマンド実行)
.              .bash_profile略
$ echo $?       (直前のコマンドの終了ステータスを表示せよ)
0           (正常に終了した)

このような終了ステータスの仕組みを活用してif文は機能しているということだ('')
なので普通のプログラミング言語とは違い、単に条件式を記述するのではなく終了ステータスを確認するためにコマンドを記述しないといけないのだ。
シェルスクリプトのif文作ったひと!すごい!(>
<)

まとめ

あしたって休みだよね?水道屋さん休みでいいんだよね?

Discussion

キクキク

すみません。
※fiってとじるって意味らしい。
の部分なのですが
どちらの情報でしょうか。
気になり、質問させていただきました。