💬

Linuxシェル(bash)の使いはじめに知っておく基本構文

2021/04/15に公開

はじめに

Linuxに触っていてシェルを使いこなせると良いなと思います。そこでシェルの使い始めに知っておく良いんじゃないかという事をまとめてみたいと思います。
基本的にシェルはbashになると思いますが、bash以外にcshやzshなどシェルに種類があります。特にcshは使いこなしている方の話も聞きますがは今回はbashに限定したいと思います。

シェルのコメントアウト

シェルの中にコメントを記述する際は行頭に「#」をつけます。

# コメントアウトとして扱われます

変数

シェルはプログラミング言語のように変数が使えます。
変数は「シェル変数」と「環境変数」の2種類があり「シェル変数」は実行されているシェル以外のプログラムに影響を与えませんが「環境変数」はシェルから呼び出されて実行されるプログラムにも影響します。
両方ともシェルの実行が終了すると破棄(クリア)されます。

変数宣言

# シェル変数の宣言
変数名="値"
# シェル変数を環境変数に設定する
export 変数名
```bash
環境変数に設定すると、そこから先の変更はシェル変数と同様に行うことができます。

シェル変数と環境変数の変更は同じ

変数名=値

## 変数の使い方
変数は$変数名と$マークを先頭につけるか、${変数名}として${}をつけて使用します。
```bash
# 変数宣言
aaa="bbb"
# 使い方1
echo $aaa
bbb
# 使い方2
echo ${aaa}
bbb

コマンドの実行結果を変数に保存する

「変数名=コマンド」とすることでコマンドの実行結果を変数に格納できます。

KYOU=`date +%Y%m%d`
echo $KYOU

命令の連続実行はセミコロン「;」

セミコロンをつけることで命令を連続して実行する事ができます。また、基本的に命令は1行につき1つですが、1行に複数の命令を記述したい場合は セミコロン「;」 を使用します。

echo "aaa" ; echo "bbb"; echo "ccc"
# 結果
aaa
bbb
ccc

カッコ によりグルーピングする

カッコ を使うと命令は別のシェルとして実行されて結果はまとめて出力されます。
別のシェルとして動くのでカッコ内で変数を使ってもカッコの外側で使うことはできません。

# カッコ内でシェル変数宣言をする`
(ccc="ddd"; echo ${aaa})
# カッコから出ると使うことはできない
echo ${ccc}

# カッコ内でexportして環境変数にしても外側で利用できない
(ccc="ddd"; echo ${aaa}; export ccc)
# カッコから出ると使うことはできない
echo ${ccc}

# カッコの外側で宣言した変数は、そのままカッコ内で使用できる
ddd="eee"
(echo ${ddd})

算術式

シェルの変数は基本的に文字列として扱われます。数値として計算をする際は算術式として $((変数名)) という形で記述する必要があります。

i=10
echo $((i*2))

bashでは整数しか使えないです。小数点以下の取り扱いはできないので注意が必要です。

$?による終了ステータスの確認

直前に実行された命令の終了ステータスが「$?」という特殊な変数に格納されます。正常終了は「0」となり、それ以外のエラー時などは0以外の値が格納されます。

echo aaa
echo $?
# 結果
0

# 誤ったコマンド
echp aaa
echo $?
# 結果
127

これにより実行結果が正常以外だった場合の処理などを記述する事ができます。

サービスのステータスを確認するコマンドと組み合わせると

service ssh status > /dev/null; echo $?

sshサービスが起動中であれば「0」 停止中や未定義であれば「0以外」が$?に格納されますのでサービスが起動しているかどうかのチェックも$?を使うことで行えます。

比較演算子

シェルではif文を利用する事ができます。

if 条件1 ; then
  条件が真の場合の処理
elif 条件2 ; then
  条件が真の場合の処理
else
  条件が偽の場合の処理
fi

IF文で使える演算子

| 演算子 | 内容 |
| ---- | ---- | ---- |
| == | 等しい |
| != | 等しくない |
| < | より小さい |
| <= | 以下 |
| > | より大きい|
| >= | 以上 |
| && | 論理積 |
| || | 論理和 |

補足:下記のような記述も正しいそうですが、if~thenまでに2行を使ってしまう事になるため「;」をつけて1行にまとめる事が好まれるようです。

if 条件
then

fi

繰り返し文

繰り返し文はforとwhileの2種類を使うことができます。

for文

for文を使うことができます。

基本

for ((i=0; i<=5; i++)); do
  echo ${i}
done

※カッコが2つ必要になるので注意です。

配列

strs="a b c";
for str in ${strs}; do
  echo ${str}
done

while文

条件が偽になるまで繰り返すループです。

i=0
while ((${i}<=5)); do
  echo ${i}
  i=$((i+1))
done

関数

関数の定義を行うことができます。

function 関数名 () {
  処理
}

引数は$1,$2...に引数の1つ目から順に入ってきます。

関数の呼び出し方

関数名 引数1 引数2

本格的な言語と比べてシンプルな構造になるのでコンパクトな処理を書くのに向いてそうです。

まとめ

他にも「awk」コマンドなどでテキストファイルを変更させたりすると幅が広がりそうと感じます。
シェルを使うことでサービスが停止していたら起動するなど状態を見て動きを変えることが出来るため慣れていなければ作り出すのに苦労するかもしれませんが、頑張って用意しておけばコマンドを呼び出すだけで実行できるので、ある程度は使えるようになっておくと選択肢が増えて良いような気がします。

GitHubで編集を提案

Discussion