- 同じことを2度ググらないための備忘録
- 簡単なことでも2週間叩かないと意外にアレっとなる
- そのやり方、ダサいよ、という指摘がある方はブコメで悪口を書くか、ブログのコメント欄で教えてください
もくじ
基本構文
数値比較条件
test <value> (-eq|-gt|-lt|-ge|-le) <value>
[ <value> (-eq|-gt|-lt|-ge|-le) <value> ]
$ #=> 10 == 10
$ if [ 10 -eq 10 ]; then echo true; else echo false; fi
true
$ if test 2 -eq 10; then echo true; else echo false; fi
false
文字比較条件
test <value> (==|!=) <value>
[ <value> (==|!=) <value> ]
$ if [ "abc" == "abc" ]; then echo true; else echo false; fi
true
$ if [ "abc" == "def" ]; then echo true; else echo false; fi
false
$ if [ "abc" != "def" ]; then echo true; else echo false; fi
true
数値計算
整数の計算
$ echo $((1 + 2 - 3 * 4))
-9
expr
を使うという方法もある
小数の計算
awk
を使う方法
$ echo "" | awk '{print 1 + 2 - 3 * 4 / 5}'
0.6
bc
を使う方法
$ echo "scale=2; 1 + 2 - 3 * 4 / 5" | bc
.60
jq
を使う方法
$ jq -n "1 + 2 - 3 * 4 / 5"
0.6000000000000001
時刻計算
時刻 => unixtime
# 現在時刻の unixtime
$ date +%s
1556175641
# 特定時刻の unixtime
$ date --date '2019-04-24 10:46:30+00:00' +%s
1556102790
unixtime => 時刻
# unixtime から日時表記へ
$ date --date "@1556175641"
Thu Apr 25 16:00:41 JST 2019
ISO8601 形式へ
$ date --iso-8601=seconds
2019-04-25T16:05:20+09:00
タイムゾーン計算
$ TZ=UTC date --iso-8601=seconds
2019-04-25T07:05:40+00:00
echo
改行コードを含む文字列の出力
$ echo -e "1\n2\n3\n4\n5\n"
1
2
3
4
5
改行しない
-n
オプション
$ echo -n hoge; echo fuga
hogefuga
cat
ヒアドキュメント
$ cat << eos
> 1
> 2
> 3
> 4
> 5
> eos
1
2
3
4
5
awk
列の抽出
$ echo 1 2 3 4 5 | awk '{print $3}'
3
行の抽出
$ echo -e "A\nB\nC\nD\nE\n" | awk 'NR==3'
C
CSV の処理
$ cat csv.csv
taro,16,100
jiro,14,200
saburo,11,300
$ #=> 列の抽出
$ cat csv.csv | awk -F, '{print $2}'
16
14
11
$ #=> 列を抽出して合計値/平均値計算
$ cat csv.csv | awk -F, '{sum2+=$2; sum3+=$3;} END {printf("sum: %s, %s\n", sum2, sum3)}'
sum: 41, 600
$ cat csv.csv | awk -F, '{sum2+=$2; sum3+=$3;} END {printf("average: %s, %s\n", sum2/NR, sum3/NR)}'
average: 13.6667, 200
nkf
URL エンコード
$ echo 'あいうえお' | nkf -WwMQ | tr = %
%E3%81%82%E3%81%84%E3%81%86%E3%81%88%E3%81%8A
URL デコード
$ echo 'あいうえお' | nkf -WwMQ | tr = %
%E3%81%82%E3%81%84%E3%81%86%E3%81%88%E3%81%8A
$ echo '%E3%81%82%E3%81%84%E3%81%86%E3%81%88%E3%81%8A' | nkf --url-input
あいうえお
jq
整形しない
-c
オプション
$ echo '{ "members": ["cocoa", "chino","rize"] }' | jq
{
"members": [
"cocoa",
"chino",
"rize"
]
}
$ echo '{ "members": ["cocoa", "chino","rize"] }' | jq -c
{"members":["cocoa","chino","rize"]}
単純なフィールドの取り出し
$ echo '{"key": "value"}' | jq '.key'
"value"
文字列のダブルクオートを外す
-r
オプション
$ echo '{"key": "value"}' | jq -r '.key'
value
配列を剥がす
$ echo '{ "members": ["cocoa", "chino","rize"] }' | jq '.members[]'
"cocoa"
"chino"
"rize"
配列につっこむ
-s
オプション
$ echo '{}' | jq -s
[
{}
]
配列の長さを取得
length
でできる
$ echo '[1,2,3,4,5,6,7]' | jq 'length'
7
配列のマップ
$ echo '[1,2,3,4,5,6,7]' | jq '.[] + 1'
2
3
4
5
6
7
8
$ echo '[1,2,3,4,5,6,7]' | jq 'map(. | tostring) | map("[" + . + "]")'
[
"[1]",
"[2]",
"[3]",
"[4]",
"[5]",
"[6]",
"[7]"
]
値がマッチ|部分一致する要素をフィルター
select(<key> | <test|contains>(<value>))
でできる
$ cat /tmp/ex.json
{
"members": [
{
"id": 1,
"name": "cocoa"
},
{
"id": 6,
"name": "chino"
},
{
"id": 3,
"name": "rize"
}
]
}
$ cat /tmp/ex.json | jq '.members[] | select(.name | contains("ch"))' | jq -s
[
{
"id": 6,
"name": "chino"
}
]
ソート
$ cat /tmp/ex.json
{
"members": [
{
"id": 1,
"name": "cocoa"
},
{
"id": 6,
"name": "chino"
},
{
"id": 3,
"name": "rize"
}
]
}
$ cat /tmp/ex.json | jq '.members | sort_by(.id)'
[
{
"id": 1,
"name": "cocoa"
},
{
"id": 3,
"name": "rize"
},
{
"id": 6,
"name": "chino"
}
]
複数の素の JSON を配列に突っ込む
$ cat /tmp/json
{"a":1,"b":5}
{"a":2,"b":4}
{"a":3,"b":3}
{"a":4,"b":2}
{"a":5,"b":1}
$ cat /tmp/json | jq -s
[
{
"a": 1,
"b": 5
},
{
"a": 2,
"b": 4
},
{
"a": 3,
"b": 3
},
{
"a": 4,
"b": 2
},
{
"a": 5,
"b": 1
}
]
特定のキーを置換
$ cat /tmp/json
{"a":1,"b":5}
$ cat /tmp/json | jq '.a = true'
{
"a": true,
"b": 5
}
簡単なスクリプト作成時によく書くもの
dev/prod ステージ選択
ARG1=$1
if [ $# -ne 1 ] || [[ ! $ARG1 =~ ^(prod|dev)$ ]]; then
echo "usage: ./deploy [prod|dev]"
exit 1
fi