Armoris日記 Shell for if編

このブログは、3月までN高等学校に潜んでいた株式会社Armorisの社員が書いています。

あるもりすぶろぐの内容は個人の意見です。

Shell で for文とか if文が使いたい!!!

今回の Armoris日記は Shellスクリプトを書いているとき唐突に for文や if文を使いたくなってしまった方向けです。

内容は普段私が書いている書き方になるので、間違っている部分があればご指摘お願いします。

for文 if文とは?

簡単に for と if について説明します。
for文は 20回 Hello と出力したいなどあることを一定回数繰り返したいときに使います。
if文はもし入力された値が 10 なら Hello それ以外であれば World を出力するなど特定の条件で処理を変えたいときに使います。

早速 for文を書く

早速 Shellスクリプトでの for文の書き方を2つ紹介します。以下で紹介する書き方は最も汎用性が高く個人的によく使う書き方だと思います。
これはプログラムを書いたことある人であれば馴染みやすいのではないかと思います。

#!/bin/bash

echo "for sample 1"
for i in `seq 1 3`
do
        echo $i
done

echo "for sample 2"
for i in {1..3}
do
        echo ${i}
done

2つの for文はそれぞれ書き方が少し違いますが実行結果は以下のように同じになります。

for sample 1
1
2
3
for sample 2
1
2
3

おまけ 無限ループ

for文から少し離れてしまいますがたまには無限ループを使いたくなる時もあると思います。
そこで while を使って無限ループを作る方法を以下で紹介します。

while : ;
do
        echo hoge
done

もちろん無限ループなので実行結果は永遠とhogeが出力され続けます。

if文を書く

次に Shell で if文を使いたいときの書き方を紹介します。
まずは条件式内で比較に使える記号を確認します。

記号 Shell
= =
> -gt
< -lt
>= -ge
<= -le
NOT !
AND -a 又は &&
OR -o 又は ||

全ての例を書くと長くなってしまうため一部のみ紹介させていただきます。

#!/bin/bash

A="A"
B="A"
if [ $A = $B ] ;
then
        echo "AとBは同じ文字列"
else
        echo "AとBは違う文字列"
fi

A=4
B=2
if [ $A -lt $B ] ;
then
        echo "Bの方が大きい"
else
        echo "Aの方が大きい"
fi

A=2
B=4
if [ $A -gt $B ] ;
then
        echo "Aの方が大きい"
else
        echo "Bの方が大きい"
fi

これで for文と if文を使った簡単な処理が Shellスクリプトで書けるようになります。
最低限これら2つが使えるだけでもより多くのことが Shellスクリプトでできるようになります。

他にも for文を使ってテキストファイルの内容を1行ずつ処理することも可能ですし、例で紹介した if文の比較以外にも表にあるものを使ってより複雑な条件分岐をさせることも可能です。

おまけ

最初に紹介した for文の中で以下の書き方をすると一部環境では出力結果が異なる場合があります。

#!/bin/bash

for i in {1..3}
do
        echo ${i}
done

実行結果

{1..3}

これについて調べてみると以下の Qiita記事を見つけました。
Qiita:bashで「Syntax error: "(" unexpected」が表示される

どうやら Ubuntu 上で Shellスクリプトを実行すると、配列や上の例で挙げている for文などで公文エラーや意図しない挙動になることがあるようです。
原因は dash と言うシェルが使用されている為だそうです。

私の環境でも以下のようになっていました。

$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Feb 14  2019 /bin/sh -> dash
$ which bash
/bin/bash

解決策としてはシェルを変更する方法と、以下のように直接 bash を指定して実行することで一時的に実行することができます。

$ /bin/bash example.sh

以上で今週の Armoris日記を終わりにしようと思います。

それでは良いスクリプトライフを!!!