Open12

bashスクリプトをつくる

tanatana

ヒアドキュメント

ものすごく適当(いかんせんデプロイ用)なので、
コマンドと違う文字列を指定したら出力する程度にとどめています。

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
...省略
tanatana

ログ出力

各処理時にログをだすように関数を定義する

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!!
tanatana

if文

条件文をうまくつくれないなら:でなにもしないとして条件を書いてしまうほうが早かったです...。

if [ $1 =~ ^[0-9]+$ ]; then
# なにもしない
:
else
echo "you must choose number"
fi
tanatana

switch文的な

if文を羅列しても同じです。

case $1 in
 "start")
 ;;
 "stop")
 ;;
 "down")
 ;;
esac
tanatana

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
tanatana

文字列置換

  • 指定文字列以降を置き換える
    \1とすると、括弧内の文字列が保持された状態になる
    括弧はエスケープする
    -i : 指定ファイルに上書きする
sed -i "s/\(test=\).*/\1dummy" test.txt
tanatana

コマンドワンライナー

  • command1 の結果を渡して実行
command1 | command2
  • command1 の結果が成功した場合のみcommand2 が実行
command1 && command2
  • comman1 の結果が失敗した場合のみcommand2 が実行
command1 || command2
  • 通常(結果に関係なく実行)
command1
command2
tanatana

while文

i=10
while [[ $i <= 10 ]]; do
    echo "count:$i"
    #count:10
done
tanatana

キー指定配列

定義

declare -A DUMMY=(
  ["staging"]=111
  ["prod"]=999
)

値取得

$DUMMY["prod"]
#999
tanatana

コマンド実行結果を変数に代入

#シングルクォーテーションで囲む
value=``
#例
#実行結果を配列に入れることも可能
# カレントディレクトリ内にあるテキストファイルパスをすべて取得する
files=(`find . -type f -name "*txt"`)
# 現在時刻を設定
now=`date "+%Y-%m-%dT%H:%M:%S"`