はじめに
業務でシェルスクリプトの作成が出てきたので、業務で頻出した条件分岐やそのオプションを備忘録として残しておきます。複雑なのは書かないです。
あくまで、備忘録なので簡単に...(なんとなく思い出せないときとかに見るものなので...)
if文:単純な数字とかの比較
#!/bin/bash
# 条件分岐の基本
COUNT=0
if [ "${COUNT}" -eq 0 ]; then
echo "これは0です。"
elif [ "${COUNT}" -lt 0 ]; then
echo "これは0未満です"
elif [ "${COUNT}" -gt 0 ]; then
echo "これは0より大きいです"
else
echo "これは0と0未満以外です"
fi
これは0です。
主にループだったり、エラーコードだったり、数値で比較するときに使ってました。
数値を比較するときは以下の演算子を使えばよさそうです。
演算子例 | 書き方例 | |
---|---|---|
-eq | A -eq 0 | A = 0のとき(Aと0が等しいとき) |
-lt | A -lt 0 | A < 0のとき(Aが0未満のとき) |
-gt | A -gt 0 | A > 0のとき(Aが0より大きいとき) |
-le | A -le 0 | A ≦ 0のとき(Aが0以下のとき) |
-ge | A -ge 0 | A ≧ 0のとき(Aが0以上のとき) |
-ne | A -ne 0 | A ≠ 0のとき(Aが0ではないとき) |
※業務でよく使ってたのは「-eq」「-ne」「-lt」で、「-gt」「-ge」はほとんど使ってなかったです。
if文:文字列の比較
#!/bin/bash
# 条件分岐の基本
SENTENCE1="Hello World!"
SENTENCE2="New World!"
# 「==」か「=」で左右の文字列が等しいとき真
if [ "${SENTENCE1}" == "Hello World!" ]; then
echo "SENTENCE1 は Hello World! が入ってます"
fi
# 「!=」で左右の文字列が等しくないとき真
if [ "${SENTENCE2}" != "old World!" ]; then
echo "SENTENCE2 は old World! ではないです"
fi
SENTENCE1 は Hello World! が入ってます
SENTENCE2 は old World! ではないです
可読性や保守性に欠けるので、文字列の比較ならcase文を使ったほうがいい場合もありそう。(後述)
if文:ファイルの確認時に使う条件など
#!/bin/bash
#「-f」はファイルがあれば真、「-s」はファイルが空でなければ真となる。
# file1.txtのファイルはあるが何も記載されていないとき=0byteのとき
# file1.txtをtouchコマンドで作成
touch file1.txt
if [ -f "file1.txt" ]; then
echo "file1.txt EXISTS"
fi
if [ -s "file1.txt" ]; then
echo "file1.txt not 0byte"
fi
# file2.txtのファイルの中に何か文字が記載されているとき=0byteではないとき
echo "echo" > file2.txt
if [ -f "file2.txt" ]; then
echo "file2.txt EXISTS"
fi
if [ -s "file2.txt" ]; then
echo "file2.txt not 0byte"
fi
file1.txt EXISTS
file2.txt EXISTS
file2.txt not 0byte
1つ目のfile1.txtはファイルは作られているが、ファイルの中身は何もないので、1つ目だけが真
2つ目のfile2.txtはファイルがあり、ファイルの中身は"echo"とい文字列があり、空ではないので1つ目2つ目ともに真
となります。
if文:ディレクトリの存在確認に使う条件
#!/bin/bash
#「-d」はディレクトリがあれば真となる。
# 現在のディレクトリ配下にabcディレクトリとabcディレクトリの配下にcdeディレクトリを作成
mkdir -p abc/cde
if [ -d abc ]; then
echo "abc directory exist"
else
echo "abc directory not exist"
fi
if [ -d cde ]; then
echo "cde directory exist"
else
echo "cde directory not exist"
fi
if [ -d abc/cde ]; then
echo "abc/cde directory exist"
else
echo "abc/cde directory not exist"
fi
abc directory exist
cde directory not exist
abc/cde directory exist
現在のディレクトリにabcディレクトリはあるから、真(1つ目のif文)
現在のディレクトリにcdeディレクトリはないので、偽(2つ目のif文)
現在のディレクトリにabcディレクトリがあり、その配下にcdeディレクトリはあるから、真(3つ目のif文)
となっています。
case文:基本的な書き方
#!/bin/bash
WORD1="LOGICAL"
# case文の基本
# 比較対象の文字列を"文字列")の形で書く
case "${WORD1}" in
"LOGICAL")
echo "Word is LOGICAL"
;;
"PYHSICAL")
echo "Word is PYHSICAL"
;;
*)
echo "Word is Not LOGIAL/PYHSICAL"
;;
esac
# ワイルドカード(*)を使えばもう少し柔軟に。
WORD2="PYHSICAL"
case "${WORD2}" in
"LOGI"*)
echo "Word is LOGI + any-words"
;;
"PYHS"*)
echo "Word is PYHS + any-words"
;;
*)
echo "Word is Not LOGI~~/PYHSICAL~~"
;;
esac
Word is LOGICAL
Word is PYHS + any-words
case文:OR(または)に相当する書き方
#!/bin/bash
# 比較対象の文字列をパイプでつなげて "文字列"|"文字列"|"文字列"・・・)の形で書く
WORD3="NO"
case "${WORD3}" in
"yes" | "y" | "YES")
echo "Word is yes or y or YES"
;;
"no" | "n" | "NO")
echo "Word is no or n or NO"
;;
*)
echo "error"
;;
esac
Word is no or n or NO
WORD3には"NO"が入っているので、case文の2つ目の
"no" | "n" | "NO")
にヒットして当該の文章を出力しています。
違う文字列だけど同じ処理をさせたいときには便利かもです。
おわりに
業務で頻出した条件分岐やそのオプションを備忘録として記載してきました。
シェルについてはまだ3か月程度の初心者なので、これからも精進していきます...