Open12
bashスクリプトをつくる
宣言
#
のあとに!
を書く
#!bin/bash
ヒアドキュメント
ものすごく適当(いかんせんデプロイ用)なので、
コマンドと違う文字列を指定したら出力する程度にとどめています。
if [ $# -ne 1 ] || ([ "$1" != "start" ] && [ "$1" != "stop" ] && [ "$1" != "down" ]); then
cat << EOF
description:
run docker container.
usage:
$0 start : setup docker container
$0 stop : stop docker container
$0 down : delete docker container
EOF
exit 1
fi
AND条件
上では&&
ですが、-a
でも結果は同じです。
if [ $# -ne 1 ] || ([ "$1" != "start" -a "$1" != "stop" -a "$1" != "down" ]); then
...省略
ログ出力
各処理時にログをだすように関数を定義する
readonly PROCNAME=${0##*/}
function log() {
local fname=${BASH_SOURCE[1]##*/}
local now=`date "+%Y-%m-%dT%H:%M:%S"`
local color=${2:-32}
printf "\e[${color}m"
printf "[${now}] ${PROCNAME} (${fname}:${FUNCNAME[1]}:${BASH_LINENO[0]}) $1\n"
printf "\e[m"
}
指定するときは
log "success!!!"
コンソール上に出力
[2000-01-01T24:59:59] setup.sh (setup.sh:main:12) success!!
if文
条件文をうまくつくれないなら:
でなにもしないとして条件を書いてしまうほうが早かったです...。
if [ $1 =~ ^[0-9]+$ ]; then
# なにもしない
:
else
echo "you must choose number"
fi
正規表現の一致
"${1}" =~ ^[0-9]+$
switch文的な
if文を羅列しても同じです。
case $1 in
"start")
;;
"stop")
;;
"down")
;;
esac
for文
配列の要素を取得し、最後まで繰り返す
ARRAY=(
1 2 3 4 5
)
for value in "${ARRAY[@]}";
do
echo $value
done
こちらの方法でも同じです。
for ((i = 0; i < ${#ARRAY[@]}; i++));
do
echo ${ARRAY[$i]}
done
文字列置換
- 指定文字列以降を置き換える
\1
とすると、括弧内の文字列が保持された状態になる
括弧はエスケープする
-i : 指定ファイルに上書きする
sed -i "s/\(test=\).*/\1dummy" test.txt
コマンドワンライナー
- command1 の結果を渡して実行
command1 | command2
- command1 の結果が成功した場合のみcommand2 が実行
command1 && command2
- comman1 の結果が失敗した場合のみcommand2 が実行
command1 || command2
- 通常(結果に関係なく実行)
command1
command2
while文
i=10
while [[ $i <= 10 ]]; do
echo "count:$i"
#count:10
done
キー指定配列
定義
declare -A DUMMY=(
["staging"]=111
["prod"]=999
)
値取得
$DUMMY["prod"]
#999
コマンド実行結果を変数に代入
#シングルクォーテーションで囲む
value=``
#例
#実行結果を配列に入れることも可能
# カレントディレクトリ内にあるテキストファイルパスをすべて取得する
files=(`find . -type f -name "*txt"`)
# 現在時刻を設定
now=`date "+%Y-%m-%dT%H:%M:%S"`