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