shellscript tips

便利な小技集


Posted on Sat, Jun 23, 2018
Tags bash, shellscript

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

参考