Bash(Shell)でディレクトリ、リストをforループする

よく使うのでメモとして掲載します。

Bash(Shell)でディレクトリ、リストをforループする サンプルコード


#!/bin/bash

echo "ディレクトリ直下のファイルをループ"
dir_path="sample_dir/*"
for dir in $dir_path; do
    echo "$dir"
done

echo --------------------------

# リスト定義
declare -a list=(
    "foo"
    "bar"
    "baz"
)

echo "リストをループする"
for row in "${list[@]}"; do
    echo "$row"
done

echo "インデックス付きでリストをループする"
for i in "${!list[@]}"; do
    echo "$i : ${list[$i]}"
done

echo --------------------------

echo "連番でループ{}"
for i in {0..3}; do
    echo ${i}
done

echo "連番でループ seq"
for i in $(seq 0 3); do
    echo "$i"
done

実行結果


# ディレクトリ直下のファイルをループ
sample_dir/sample_01.txt
sample_dir/sample_02.txt
--------------------------
# リストをループする
foo
bar
baz
# インデックス付きでリストをループする
0 : foo
1 : bar
2 : baz
--------------------------
# 連番でループ{ }
0
1
2
3
# 連番でループ seq
0
1
2
3


ディレクトリ直下のファイルをfor文でループ


#!/bin/bash

# ディレクトリ直下のファイルをループ
dir_path="sample_dir/*"
echo "\$dir_path -> " $dir_path
for dir in $dir_path; do
    echo "$dir"
done

# 結果
# 
# $dir_path ->  sample_dir/sample_01.txt sample_dir/sample_02.txt
# sample_dir/sample_01.txt
# sample_dir/sample_02.txt


リストをfor文でループ、インデックス付きfor文でループ

#!/bin/bash

# リスト定義
declare -a list=(
    "foo"
    "bar"
    "baz"
)

# リストをループする
echo "\$\"{list[@]}\" -> " "${list[@]}"
for row in "${list[@]}"; do
    echo "$row"
done

echo

# インデックス付きでリストをループする
echo "\$\"{!list[@]}\" -> " "${!list[@]}"
for i in "${!list[@]}"; do
    echo "$i : ${list[$i]}"
done

# 結果
# 
# $"{list[@]}" ->  foo bar baz
# foo
# bar
# baz

# $"{!list[@]}" ->  0 1 2
# 0 : foo
# 1 : bar
# 2 : baz


連番をfor文でループ


#!/bin/bash

# 連番でループ {}
echo "{0..3} -> " {0..3}
for i in {0..3}; do
    echo ${i}
done

echo

# 連番でループ seq
echo "\$(seq 0 3) -> " $(seq 0 3)
for i in $(seq 0 3); do
    echo "$i"
done

# 結果
#
# {0..3} ->  0 1 2 3
# 0
# 1
# 2
# 3

# $(seq 0 3) ->  0 1 2 3
# 0
# 1
# 2
# 3

PostgreSQL psqlで引数とSQLファイルを指定して実行する

psqlとはPostgreSQLのターミナル型SQLクライアントです。

引数に指定した値をSQLファイルの変数にバインドします。

psqlで引数とSQLファイルを指定して実行する サンプルコード

sample.sql

実行するSQLファイル、”:変数”の箇所を置き換えます。

select :foo,
       :bar,
       :hoge;

p_exec_file.sh

実行するshellです。psqlを呼び出し、”-f”オプションでSQLファイルを指定し、”-v”オプションで引数名と値を設定します。”–echo-all”は実行したSQLを結果と一緒に出力します。

#!/bin/bash

DB_USER="{user_name}"
DB_PWD="{password}"
DB_SERVER="{db_server_url}"
DB_PORT="{db_port}"
DB_NAME="{db_name}"

psql \
    -d "postgresql://$DB_USER:$DB_PWD@$DB_SERVER:$DB_PORT/$DB_NAME" \
    -f "sample.sql" \
    -v foo="now()" \
    -v bar="1" \
    -v hoge="'test_str'" \
    --echo-all


実行結果

p_exec_file.shを実行します。実行したSQL文と結果が出力されます。”foo”に”now()”、”bar”に”1″(数値)、”hoge”に”test_str”(文字)が設定されています。

$ ./p_exec_file.sh
select :foo,
       :bar,
       :hoge;
              now              | ?column? | ?column?
-------------------------------+----------+----------
 2019-12-28 16:10:25.343578+09 |        1 | test_str
(1 行)

IBM WatsonのVisual Recognitionで画像認識する(Curl)


Visual Recognitionとは?

Visual RecognitionはIBM社のWatsonが提供する画像認識機能です。

以下は、公式ページの説明です。

Visual RecognitionはWatsonの画像認識機能です。すぐにお使いいただけるようにWatsonが既に学習をしており、画像・映像フレームに写った複数のものや、情景を分析・認識することができます。また、機械学習によりWatsonに独自の学習をさせることもできます。すでに、自社製品の認識・分類や、製造ラインにおける欠陥検出といった多種多様なお客様の業務で、高い精度の画像認識を少ない画像枚数による短時間の機械学習で実現しています。さらに、日本語・英語を含む多数の言語で認識結果を返すことができます。

https://www.ibm.com/watson/jp-ja/developercloud/visual-recognition.html


公式ページにもあるように、事前学習済みのため、サービス利用するために、アカウントを作成すれば、すぐに利用できるようです。(制限があるが無料で利用可能)


Visual Recognitionで画像認識する

アカウントを作成し、APIキーを取得したら、classifyメソッドを利用して画像認識を行います。

画像識別するフルーツの画像

https://watson-developer-cloud.github.io/doc-tutorial-downloads/visual-recognition/fruitbowl.jpg


classify curl 画像URL指定 サンプルコード


#!/bin/bash

# api key
api_key="API KEYを設定する"
# service end_point
end_point="https://api.us-south.visual-recognition.watson.cloud.ibm.com"
method="v3/classify"
url="$end_point/$method"

# フルーツの画像
image_url="https://watson-developer-cloud.github.io/doc-tutorial-downloads/visual-recognition/fruitbowl.jpg"

# Visual Recognitionのclassifyへ送信
curl -u "apikey:$api_key" \
    "$url?url=$image_url&version=2018-03-19&Accept-Language=ja"

Visual RecognitionのclassifyメソッドへCurlを使ってGETします。アカウントを作成後に取得したAPIキー、画像のURLを指定します。

※今回はサンプルで利用されているフルーツの画像を利用。

classify 実行結果(JSON)


{
    "images": [
        {
            "classifiers": [
                {
                    "classifier_id": "default",
                    "name": "default",
                    "classes": [
                        {
                            "class": "バナナ",
                            "score": 0.562,
                            "type_hierarchy": "/果実/バナナ"
                        },
                        {
                            "class": "果実",
                            "score": 0.788
                        },
                        {
                            "class": "規定食 (食品)",
                            "score": 0.528,
                            "type_hierarchy": "/食物/規定食 (食品)"
                        },
                        {
                            "class": "食物",
                            "score": 0.528
                        },
                        {
                            "class": "ハネデュー",
                            "score": 0.5,
                            "type_hierarchy": "/果実/メロン/ハネデュー"
                        },
                        {
                            "class": "メロン",
                            "score": 0.501
                        },
                        {
                            "class": "オリーブ色",
                            "score": 0.973
                        },
                        {
                            "class": "レモン・イエロー (色)",
                            "score": 0.789
                        }
                    ]
                }
            ],
            "source_url": "https://watson-developer-cloud.github.io/doc-tutorial-downloads/visual-recognition/fruitbowl.jpg",
            "resolved_url": "https://watson-developer-cloud.github.io/doc-tutorial-downloads/visual-recognition/fruitbowl.jpg"
        }
    ],
    "images_processed": 1,
    "custom_classes": 0
}


結果は、JSON形式で返却されます。”class”にバナナ、果実、メロン、 オリーブ色などクラス名が、”score”に0~1の範囲で プロパティの信頼スコアが返却されます。スコアが高いほど、クラスが画像に描かれている可能性が高くなります。


classify curl ローカル画像指定 サンプルコード


#!/bin/bash

# api key
api_key="API KEYを指定する"
# service end_point
end_point="https://api.us-south.visual-recognition.watson.cloud.ibm.com"
method="v3/classify"
url="$end_point/$method"

# 画像のパス
image_path="img/fruitbowl.jpg"

# Visual Recognitionのclassifyへ送信
curl -X POST \
    -u "apikey:$api_key" \
    -F "images_file=@$image_path" \
    -F "threshold=0.6" \
    "$url?version=2018-03-19&Accept-Language=ja"


ローカル画像を利用するには、POSTを指定して、@ファイル名でローカル画像のパスを指定します。”threshold”で返却する閾値を指定します。上記の例だと、0.6以上のもののみ取得。

classify 実行結果(JSON)

{
    "images": [
        {
            "classifiers": [
                {
                    "classifier_id": "default",
                    "name": "default",
                    "classes": [
                        {
                            "class": "果実",
                            "score": 0.788
                        },
                        {
                            "class": "オリーブ色",
                            "score": 0.973
                        },
                        {
                            "class": "レモン・イエロー (色)",
                            "score": 0.789
                        }
                    ]
                }
            ],
            "image": "fruitbowl.jpg"
        }
    ],
    "images_processed": 1,
    "custom_classes": 0
}

WEBのURLで画像を指定した場合と同様の結果が取得できました。ただし、今回は”threshold”で0.6を指定したため、0.6以上のスコアの分類しか取得していません。


感想

アカウント作成から利用まで、すごく簡単でした。zip画像を送ると独自モデルも利用できるようなので、次はそちらを利用しみたいと思います。他にも人、犬、猫なども分類してみました。

以下、猫、犬の結果例です。

猫の画像の実行結果(サンプル)

{
    "images": [
        {
            "classifiers": [
                {
                    "classifier_id": "default",
                    "name": "default",
                    "classes": [
                        {
                            "class": "ネコ",
                            "score": 1,
                            "type_hierarchy": "/動物/哺乳類/肉食動物/ネコ"
                        },
                        {
                            "class": "肉食動物",
                            "score": 0.989
                        },
                        {
                            "class": "哺乳類",
                            "score": 0.989
                        },
                        {
                            "class": "動物",
                            "score": 0.989
                        },
                        {
                            "class": "ベージュ色",
                            "score": 0.991
                        }
                    ]
                }
            ],
            "image": "cat_1.jpg"
        }
    ],
    "images_processed": 1,
    "custom_classes": 0
}

犬の画像の実行結果(サンプル)

{
    "images": [
        {
            "classifiers": [
                {
                    "classifier_id": "default",
                    "name": "default",
                    "classes": [
                        {
                            "class": "シベリアン・ハスキー",
                            "score": 0.875,
                            "type_hierarchy": "/動物/飼い慣らされた動物/犬/シベリアン・ハスキー"
                        },
                        {
                            "class": "犬",
                            "score": 0.987
                        },
                        {
                            "class": "飼い慣らされた動物",
                            "score": 0.987
                        },
                        {
                            "class": "動物",
                            "score": 0.987
                        },
                        {
                            "class": "エスキモー・ドッグ",
                            "score": 0.865,
                            "type_hierarchy": "/動物/飼い慣らされた動物/犬/エスキモー・ドッグ"
                        },
                        {
                            "class": "アジュール (色)",
                            "score": 0.903
                        },
                        {
                            "class": "灰白色",
                            "score": 0.867
                        }
                    ]
                }
            ],
            "image": "husky1.jpg"
        }
    ],
    "images_processed": 1,
    "custom_classes": 0
}

Bash(shell)の条件判定でandとorを使う

-aでANDを指定する

# true AND true
[ 2 -eq 2 -a 3 -eq 3 ];
echo "[ true AND true ] = [$?]"
# return [0]

# true AND false
[ 2 -eq 2 -a 3 -eq 4 ];
echo "[ true AND false ] = [$?]"
# return [1]


-oでORを指定する

# true OR false
[ 2 -eq 2 -o 3 -eq 4 ];
echo "[ true OR false ] = [$?]"
# return [0]

# false OR false
[ 2 -eq 5 -o 3 -eq 4 ];
echo "[ false OR false ] = [$?]"
# return [1]


&&でANDを指定する

# && (AND)
[ 2 -eq 2 ] && [ 3 -eq 3 ]; echo $?
# return [0]

[[ 2 -eq 2 && 3 -eq 4 ]]; echo $?
# return [1]


||でORを指定する

# || (OR)
[ 2 -eq 2 ] || [ 3 -eq 3 ]; echo $?
# return [0]

[[ 2 -eq 5 || 3 -eq 4 ]]; echo $?
# return [1]

Bash(shell)でパラメータ(引数)の必須チェックをする

パラメータ(引数)の数を表示する

# 引数の数を表示する
echo "引数の数は $# です"


パラメータ(引数)の数をチェックする

# 引数の数が2つかチェックする
if [ "$#" -eq 2 ]; then
  echo "引数の数は 2 です"
else
  echo "引数の数は 2 以外の $# です"
fi


パラメータ(引数)が空かチェックする(必須チェック)

# パラメータ1が空文字か判定
if [ -z "$1" ]; then
    echo "パラメータ1は、空文字です。"
else
    echo "パラメータ1は、空文字ではありません。入力文字は $1"
fi

# パラメータ2が空文字か判定
if [ -s "$2" ]; then
    echo "パラメータ2は、空文字です。"
else
    echo "パラメータ2は、空文字ではありません。入力文字は $2"
fi


バラメータ(引数)が数値のみかチェックする(数値型チェック)

if [[ $1 =~ ^[0-9]+$ ]]; then
  echo "パラメータ1は、数値のみです。"
else
  echo "パラメータ1は、数値以外の文字が含まれています。"
fi

Bash(shell)でディレクトリ・ファイルの存在チェックをする

ファイルの存在チェック

if [ -f "sample.txt" ]; then
    echo 'file exist'
else
    echo 'file not exist'
fi

ディレクトリの存在チェック

if [ -d "sample_dir" ]; then
    echo 'dir exist'
else
    echo 'dir not exist'
fi

ディレクトリが存在しなかったら作成する


DIR_PATH="sample_dir"

if [ ! -d "$DIR_PATH" ]; then
    mkdir -p $DIR_PATH
fi

[ ] -f オプション

ファイルが存在する場合、True。存在しない場合、False。

[ ] -d オプション

ディレクトリが存在する場合、True。存在しない場合、False。