RAKUS Developers Blog | ラクス エンジニアブログ

株式会社ラクスのITエンジニアによる技術ブログです。

シェルスクリプト コマンド まとめ【基本のキ】

f:id:tech-rakus:20200521123231j:plain

はじめまして、syoneshinです。

私はこれまで
IT出版/HR領域の事業開発/マーケティングを経て
現在はラクス技術広報担当として
テックブログ運営やMeetup/採用イベント企画など広報活動を行っております。

開発は未経験ですが
当社技術スタックは最低限調べ、実践し
アウトプットしようという気概で
今回は「シェルスクリプト」について書きました。

本記事が

と言う方のお役にたてれば、幸いです。

 

1.シェルスクリプトとは

 ・簡単に言うと
シェル(Windowsの「コマンドプロンプト」みたいなもの)で解釈できる命令(プログラミング言語)や命令を寄せ集めて作ったプログラムのことです。

・詳しく言うと
OS操作の為、シェル上で実行できる簡易なプログラミング言語スクリプト言語

の事です。
また、そのような言語によって書かれた
複数のOSコマンドや制御文などを組み合わせた簡易プログラムを指し
一般的にはUNIX系OS(Linuxなど)のシェルで実行できるものを指します。

シェルにはいくつかの種類があります。
大別すると以下のシェルに分けられます。
B-Shell (Bourne-Shell) 系:sh, ash, bash, zsh, ksh
C-Shell系csh, tcsh
B-Shell 系のシェルでもshシェルスクリプトでよく利用されます。
(LinuxMac OSbash がシェルの標準環境の為、bash がよく利用されています)

シェルスクリプトで書かれる典型的な処理例は
ファイル操作、プログラム実行、テキスト印刷などがあり
主に定型作業の自動化によく使われ
条件命令の実行/ファイル読み込み・書き出しなど
上から順にコマンドが実行される為、都度コマンドを打たずにすみます。

以下からは、実際にシェルスクリプトを書いていきます。


2.基本設定


ファイルを作成

 ‐シェルスクリプトファイルは.sh拡張子で基本作成
 ‐ここではtest.shファイルを作成

 
test.sh

シェルスクリプト記述で、まず初めに覚えなければならないのは次の記述
#!/bin/sh
#はhash、!はbangで、#!shebang(シェバン)と言います。
シェバンからスクリプトを実行するインタープリタが呼ばれ /bin/sh のファイルが実行されるという意味です。
#!/bin/shを書き、システムに「シェルスクリプトを書きますよ」と知らせます。

bash の独自機能を使う場合は #!/bin/bsh と書く必要があります。

 
test.sh

#!/bin/sh

 

 
test.sh

#!/bin/sh
echo "Hello, World!"

シェルスクリプトファイル(test.sh)を実行するには
ターミナルからファイルが保存されてる場所で
以下のどちらかのコマンドで実行できます。

 
$ ./test.sh

$ sh test.sh

ファイル実行すると Hello, World!と表示されます。

 
$ ./test.sh

Hello, World!

 

3.基本コマンド

 

コメント

コメントの入力には #を書く必要があります。

 
test.sh

#!/bin/sh
#コメントの入力には#を書く必要があります。


入/出力

出力は echo、入力はreadで行えます。

 
test.sh

#!/bin/sh
read NAME echo "Hi, $NAME!"

実行結果は以下

 

$ ./test.sh

syoneshin


Hi, syoneshin!

 

変数

・変数の名前には半角英数字(a-z、A-Z、0-9)とアンダーバー(_)が使えます。
・変数に値を与える時は=を前後空白なしで書きます。
・文字列の場合は"を付けて囲みます。
・変数にアクセスする時は変数名の前に$を付けます。または$付けて変数を{}で囲みます。
・1つの変数に1つの値しか保存できません。
・変数値の上書きをなくすにはreadonlyを書きます。
・変数はunsetで削除、readonlyで変数の上書き/削除不可にします。

 

test.sh

#!/bin/sh

var="変数1"
var_2="変数2"
echo "var_2=$var_2"

var_2="var_2が変更されました。"
echo ${var_2}

readonly var
var="readonly varを変えてみる。"

実行結果は以下

 
$ ./test.sh
var_2=変数2
var_2が変更されました。
./test.sh: line 11: var: readonly variable

 

シェルの特殊変数

シェルスクリプトでは以下のような特別な変数があります。

変数 機能
$1~$9 シェル引数の値。第1引数は$1、第2引数は$2でアクセス
$# シェル引数の数
$* 全引数をまとめて1つとして処理 "$*"のように囲むと、"$1 $2 … $n"形式になる。
$@ 全引数を個別として処理。全引数リスト。"$@"のように囲むと、"$1" "$2" … "$n"形式になる。
$$ 実行中のシェルのプロセスID。
$? 最後に実行したコマンドの戻り値。成功は0、失敗は1で返ってくる。
$- シェルの実行オプション(setコマンドや#!/bin/bash行に付けたオプション。
$! シェルが最後に実行したバックグラウンドプロセスのID


・シェルの特殊文字
以下はシェルスクリプト特殊文字です。
; | & ^ \ $ ? * < > ( ) [ ] { } # % = ` " ' ~ TAB SPACE NEWLINE

これら特殊文字を表示するには、エスケープする必要があり
\ バックスラッシュを付けて一文字単位で扱うか
'シングルクオーテーションを付けて囲む事で扱え使えます。

また "ダブルクオーテーションで囲んだ場合
$ ` \を評価し囲まれたすべてを文字列として扱う処理ができます。


演算子(オペレーター)

演算子」とは簡単にいうと「どんな演算をする」と表す記号の事です。
演算子」の種類は多様で
「算術演算子」「比較演算子」「論理演算子」などがあります。
 ※詳細省略

シェルでは「算術演算」を`expr 数字 演算子 数字`で計算する事ができます。
※これからプログラミングをはじめられる方は最低限「算術演算子」「比較演算子」は覚えた方がよいです。

以下表はシェルの演算子種類/意味/例を記載しています。

算術 意味 記述例
+ 足す echo `expr 10 + 20` => 30
- 引く echo `expr 20 - 10` => 10
\* 掛ける echo `expr 11 \* 11` => 121
/ 割る echo `expr 10 / 2` => 5
% 余り echo `expr 10 % 4` => 2
= 指定 a=$b bの値はaに保存されます


[ コマンドの引数に変数を指定するときは "でクォートする必要があります

比較 意味 記述例
== 等しい [ "$a" == "$b" ] 値aと値bが等しい場合TRUE(真)を返します。
!= 異なる [ "$a" != "$b" ] 値aと値bが異なる場合TRUE(真)を返します。
-eq イコール [ "$a" -eq "$b" ] 値aと値bが等しければTRUE(真)を返します。
-ne 異なる [ "$a" -ne "$b" ] 値aと値bが異なればTRUE(真)を返します。
-gt より大きい [ "$a" -gt "$b" ] 値aが値bより大きければTRUE(真)を返します。
-lt より小さい  [ "$a" -lt "$b" ] 値aが値bより小さければTRUE(真)を返します。
-ge 等しいかより大きい [ "$a" -ge "$b" ] 値aが値bと等しいか、より大きければTRUE(真)を返します。
-le 等しいかより小さい [ $a" -le "$b" ] 値aが値bと等しいか、より小さければTRUE(真)を返します。

 

論理  意味
-a 両方(and) [ "$a" -gt 90 -a "$a" -lt 100 ] 値aが 90より大きく100より小さい場合TRUEを返します。 
-o どちらか(or) [ "$a" -gt "$b" -o "$a" -lt "$b" ] 値aが値bより大きいか小さいかの場合TRUEを返します。
! ではない(is not) [ ! "$a" -gt "$b" ]  値aが値bより大きくなければTRUE(真)を返します。

 

条件分岐

 if文

シェルスクリプトのif文の基本は if [ 条件 ] then コマンド fi で書きます。

if のあとに条件式を書き、条件合致(条件がTRUE(真)の場合)していれば then から fi までのコマンドを実行します。
if文の書式は次の様になります。

 
if [ 条件1 ]; then
コマンド1
fi

もし「条件1」に合致すれば、「コマンド1」を実行しますの意味です。


条件1に合致しない場合に「コマンド2」を実行したいとき
else を使い、次の様にします。

 
if [ 条件1 ]; then
コマンド1
else
コマンド2
fi

もし「条件1」に合致すれば、「コマンド1」を実行します。
それ以外は「コマンド2」を実行しますという意味です。


さらに分岐を分けたいときにはelifを使います。※「else if」の省略

 
if [ 条件1 ]; then
コマンド1
elif [ 条件2 ]; then
コマンド2
else
コマンド3
fi

もし「条件1」に当てはまるなら、「コマンド1」を実行します。
それ以外で「条件2」に当てはまるなら「コマンド2」を実行します。
それ以外は「コマンド3」を実行するという意味です。


case文

 

case 文は Cや Java言語の switch 文に該当する制御文で
if文と同じようにコマンド実行を分岐するために使用されるものです。

基本の書き方は 
case 変数 in 条件・値) コマンド ;; esac で書きます。
条件・値が変数と合う場合、case 文は指定した条件と値の複数パターンとのマッチングにより指定したコマンドを実行します。
※単純な分岐条件で、コマンド処理が3つ以上ある場合はcase文が向いているとされます。

case文の書式は次のようになります。

 
case 値 in
条件・値1 ) コマンド1 ;;
条件・値2 ) コマンド2 ;;
条件・値3 ) コマンド3 ;;

条件・値n ) コマンドn ;;
esac


ループ処理

for文

for文はループ処理「n回数、同じ処理を繰り返す」とする制御文で
for文の書式は次のようになります。

 
for 変数 in 値リスト
do
コマンド
done

 

while文

While文はループ処理「条件を満たしている間は同じ処理を繰り返す」とする制御文で
While文の書式は次のようになります。

 
while 条件式
do
コマンド
done

 

4.まとめ

 

シェルスクリプトが動く仕組みを学び、基本構文を書いた気づきは
一度サクッと書いてみて実行結果がすぐわかると、理解がとても進むという
当たり前の事でした。

学習場面において、私の様な開発未経験者に伝えたい事は
Leap before you look(見る前に飛べ)
清水の舞台から飛び降りろ

です。

また、すっかり定着したDevOpsの文脈では
プログラムでのインフラ管理が主流になり
構成管理ツールなどは、主にスクリプト言語を利用するため
コンパイラ言語だけでなく、スクリプト言語もできる方はとても重宝されます。

これからスクリプト言語をはじめる方には
シェルスクリプトはとっかかりやすくおススメです!


【引用参考】
※WEB参考資料は以下
シェルスクリプトに挑戦しよう

シェルスクリプトに挑戦しよう(1)準備編:“応用力”をつけるためのLinux再入門(21) - @IT

・「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典
https://wa3.i-3-i.info/index.html

シェルスクリプト入門 書き方のまとめ

シェルスクリプト入門 書き方のまとめ | Memo on the Web

 

※初心者向けでシェルスクリプト理解に参考になりそうな書籍も以下ピックアップ

・新しいシェルプログラミングの教科書 

www.sbcr.jp

・[改訂第3版]シェルスクリプト基本リファレンス──#!/bin/shで、ここまでできる

gihyo.jp

・入門UNIXシェルプログラミング―シェルの基礎から学ぶUNIXの世界 

books.rakuten.co.jp


 

・エンジニア中途採用サイト
ラクスでは、エンジニア・デザイナーの中途採用を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。
20210916153018
https://career-recruit.rakus.co.jp/career_engineer/

・カジュアル面談お申込みフォーム
どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。
以下フォームよりお申込みください。
forms.gle

ラクスDevelopers登録フォーム
20220701175429
https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/

・イベント情報
会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください!
・TECH PLAY
techplay.jp
・connpass
rakus.connpass.com

 

 

Copyright © RAKUS Co., Ltd. All rights reserved.