【Bash】シェルスクリプトで先頭文字を切り出してif文で判定

テキスト読み込み時に先頭文字が #// のコメントアウトされている行を、
除外して処理を進めたい場合に毎回忘れて調べているので備忘録です。

先頭から数文字切り出す

文字列が格納された変数に対して、先頭から数文字切り出すには、以下のようなコマンドを利用します。

#!/bin/bash
hello_cmd="Hello"
hello_one="${hello_cmd:0:1}"

echo $hello_one
# output: H

Bash の変数は、"${STR:開始位置:切出す文字数}" の形式で参照すれば文字列の一部を切り出すことができます。

切り出した文字列を判定

切り出した文字列を変数へ格納し、if文で判定します。
[ $STR1 == $STR2 ] で文字列が等しいがどうかの比較が可能です。
但し文字列の長さが0(Empty)の場合にエラーが発生するため
通常は空でも文字列と判定できるように文字列を( "xxxx" )ダブルコーテーションで囲い、
[ "$STR1" == "$STR2" ] とします。

#!/bin/bash

# 先頭一文字切り出して変数 hello_one へ格納
hello_cmd="#Hello"
hello_one="${hello_cmd:0:1}"

echo $hello_one 
# output: #

# 変数 hello_one へ格納した文字列が「#」か判定
if [ "$hello_one" == "#" ]; then
    echo "ok"
else
    echo "ng"
fi
# output: ok

おまけ 空行の判定とループスキップ

テキストを読み込んだ際は、通常空行についても処理をスキップします。
[ -z "$STR" ] で空文字かどうかの判定が行えます。

#!/bin/bash

hello_emp=""
echo $hello_emp 
# output: 

# 変数 hello_emp へ格納した文字列が空か判定
if [ -z "$hello_emp" ]; then
    echo "empty"
else
    echo "not empty"
fi
# output: empty

最後にループ処理のスキップです。
whileやfor等のループ処理をスキップさせたい場合は continue を使用します。
特定の条件に当てはまる場合のみ処理をスキップさせたい場合は次のように記述します。

#!/bin/bash

hello_comment="# something comment"
hello_comment_one="${hello_comment:0:1}"
echo $hello_comment_one
# output: #

# 変数 hello_emp へ格納した文字列が # または空であれば処理をスキップ
if [ "$hello_comment_one" == '#' ]; then
    echo "sharp"
    continue
elif [ -z "$hello_comment_one" ]; then
    echo "empty"
    continue
fi
# output: sharp

これで変数に格納された文字列が「#」または空文字の場合にループ処理をスキップできます。
注意点として上記のif文はwhileやfor等のループ処理内で使用しないと
スクリプト実行時に警告(Warning)が表示されますので、ループ処理内でご使用下さい。

test.sh: 11 行: continue: `for'、`while' または `until' ループでのみ意味があります

if文やテキストのコメントアウト行の処理など毎回確認するのが面倒なので簡単にまとめました。

コメント