bash, shellscript
shellscript の小技を書いていく
shellscript で疑似乱数をつかう
math パッケージなんてものがあるわけではなく、実は環境変数を見る。
$RANDOM に疑似乱数が 0 - 32767 までの値で入っていて、それを割っている。
bc コマンドで echo された文字を評価する。
scale で桁数を選べて、 0 で整数にできる。デフォルトが 0 だから、上記の場合は必要なかったりする。
参考
スクリプトでオプションを取れるようにする
getopts コマンドで作ったスクリプトにオプションを渡せるようになる。
値を持つものは b: というように指定する必要があるから、気をつけるべし。
1#!/bin/bash
2set -eux
3
4CMDNAME=`basename $0`
5
6while getopts ab: OPT
7do
8 case $OPT in
9 "a" ) FLG_A="TRUE" ;;
10 "b" ) FLG_B="TRUE" ; VALUE_B="$OPTARG" ;;
11 * ) echo "Usage: $CMDNAME [-a] [-b VALUE] [-c VALUE]" 1>&2
12 exit 1 ;;
13 esac
14done
15
16if [ "$FLG_A" = "TRUE" ]; then
17 echo '"-a"オプションが指定されました。'
18fi
19
20if [ "$FLG_B" = "TRUE" ]; then
21 echo '"-b"オプションが指定されました。 '
22 echo "→値は$VALUE_Bです。"
23fi
参考
bash -cl の意味
CI/CD などでコンテナを触ったりするとたまに見かけるこの表記。
-c は引数を文字列として bash に渡す。-l はログインシェルとして実行される。
のだが、実はこうすることで bash としてコマンドを実行するということを明示している。コンテナのイメージによっては、デフォルトで /bin/sh で実行されたりする。
その場合は、bash の機能(配列の定義や bash に登録している path など bash で動作する想定のもの)が利用できない。
-cl とすることで、bash で動作するコマンドがそのまま実行できるということだ。 普段はターミナルが bash と決まっているから意識することがないが、ふえぇという感じだ。