shellscript tips

便利な小技集


Posted on 2018年 6月 23日 (土)
Tags bash, shellscript
bash, shellscript

shellscript の小技を書いていく

shellscript で疑似乱数をつかう

math パッケージなんてものがあるわけではなく、実は環境変数を見る。

1#!/bin/bash
2set -eux
3echo "scale=0; ($RANDOM%6)+1" | bc -l

$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 と決まっているから意識することがないが、ふえぇという感じだ。

参考

Share


See also