【Shell】実行引数をループ処理で取得し、整数の場合は加算する

■今回実装するプログラムの概要

モジュールを実行するときに引数を指定する。
引数が整数の場合は加算し、整数以外はスキップする。

▼フローチャート

▼プログラム仕様

インプット処理内容アウトプット
実行ファイル名実行ファイル名をセットする。
実行結果の初期値(0)をセットする。
実行引数【ループ処理】指定した引数分
【判断】引数が整数かどうか判定する。
整数の場合:
→実行結果に引数を加算する。
整数ではない場合:
→整数ではないメッセージを出力する。
メッセージ
「実行ファイル名:引数の値:”整数ではないのでスキップします”」
【ループ処理】ここまで
実行結果を出力する。メッセージ
「”引数(整数値)の合計”:実行結果」

▼サンプルコード

実行ファイル名:sample.sh

#!/bin/bash

# 実行ファイル名をセット(パスは削除)
readonly MODULE_NAME=${0##*/}

# 初期値をセット
result_num=0

# 引数で指定した分ループ処理
for arg_num in "$@"
do
    # 引数が整数以外の場合はスキップ
    if [[ ! $arg_num =~ ^[0-9]+$ ]]; then
        # エラーメッセージを出力
        printf '%s\n' "${MODULE_NAME}: '$arg_num': 整数ではないのでスキップします" 1>&2

        continue
    fi

    # 引数の値を加算していく
    ((result_num+=arg_num))

done

# 引数を加算した結果を出力する
printf '%s\n' "引数(整数値)の合計:$result_num"

・コードの補足

・実行ファイルの取得
実行ファイルを取得する場合、「$0」を指定するだけであると、shell実行時のパスを含む「./sample.sh」を取得するため、「${0##*/}」を指定する。
※ログ出力時、どの実行ファイルか特定するのに便利

・正規表現を判定する場合
正規表現をif文で判定する場合は「=~」と記載する(イコールとチルダ)。

・整数を判定する正規表現
整数を判定する正規表現は「^[0-9]+$」を使用する。

正規表現内容
^先頭
[0-9]0から9
+$前の文字(今回は0から9)を終わりまで繰り返す

▼実行結果

実行引数に「1 a 23 bb 456 ccc」を指定する。

$ ./sample.sh 1 a 23 bb 456 ccc 
sample.sh: 'a': 整数ではないのでスキップします
sample.sh: 'bb': 整数ではないのでスキップします
sample.sh: 'ccc': 整数ではないのでスキップします
引数(整数値)の合計:480

タイトルとURLをコピーしました