LoginSignup
4
2

More than 5 years have passed since last update.

シェルスクリプトで簡単なオプション解析

Last updated at Posted at 2018-08-07

自分自身のメモ用に、シェルスクリプトでオプションをパースするコードをメモにします。

option.sh
#!/bin/bash

parse_option () {
  if [ $1 = "h" ];then
    echo "Usage: option.sh [OPTIONS] ..."
    echo
    echo "Options:"
    echo "  -h"
    echo "  -a"
    echo "  -b"
    echo "  -c"
    echo
    exit 1
  fi
  if [ $1 = "a" ];then
    echo "a option is ${@:2:($#-1)}"
  fi
  if [ $1 = "b" ];then
    echo "b option is ${@:2:($#-1)}"
  fi
  if [ $1 = "c" ];then
    echo "c option is ${@:2:($#-1)}"
  fi
}

commands=$@

echo $commands | tr '-' '\n' | sed '/^$/d' | while read line
do 
parse_option $line
done

ここにコマンドでbash option.sh -a hoge -c fuga -b piyoってうつと

a option is hoge
c option is fuga
b option is piyo

ってなります。

簡単な説明

commandsに引数全て渡して、オプションはハイフンから始まる事を使って、trでハイフンを改行に変えてます。
一番最初のオプションのハイフンも改行コードになって、空行が上に入ってしまうのでsedで除去しています。

その結果をwhileで改行毎にループ処理をして、parse_optionが呼ばれます。引数は1行毎に与えられます

ハイフンで区切ってるので、関数に渡る一番最初の引数はオプション名になります。その後ろはオプションに渡す引数になるので${@:2:($#-1)}で2つ目以降の引数を受け取ります。

出来ること

オプションの複数指定
オプションのあと付けc
parse_option内で${@:2:($#-1)}$2にすることでイチオプションに対して値を一つのみに出来る。${@:2:($#-1)}の使いみちは-name alice bob carolのようなとき。

出来ないこと

-abのようなオプションの併記
--Aのようなロングオプション

もっと厳密にオプションをパースしたい場合

こちらの記事を参照
bash によるオプション解析

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2