使用する getopt
なぜgetopt?
複雑なコマンドライン引数を解析して混乱を避け、解析しているオプションを明確にして、コマンドの読者が何が起こっているのかを理解できるようにします。
getoptとは何ですか?
getopt
シェルプロシージャで簡単に解析できるようにコマンドラインでオプションを分割(解析)し、有効なオプションをチェックするために使用されます。これはGNU getopt(3)
ルーチンを使用して行われます。
getopt
次のタイプのオプションを使用できます。
- 価値のないオプション
- キーと値のペアのオプション
注:このドキュメントでは、構文の説明中に次のことを行います。
- []内のすべては、構文/例のオプションパラメータです。
- プレースホルダーです。つまり、実際の値で置き換える必要があります。
使い方はgetopt
?
構文:最初の形式
getopt optstring parameters
例:
# This is correct
getopt "hv:t::" "-v 123 -t123"
getopt "hv:t::" "-v123 -t123" # -v and 123 doesn't have whitespace
# -h takes no value.
getopt "hv:t::" "-h -v123"
# This is wrong. after -t can't have whitespace.
# Only optional params cannot have whitespace between key and value
getopt "hv:t::" "-v 123 -t 123"
# Multiple arguments that takes value.
getopt "h:v:t::g::" "-h abc -v 123 -t21"
# Multiple arguments without value
# All of these are correct
getopt "hvt" "-htv"
getopt "hvt" "-h -t -v"
getopt "hvt" "-tv -h"
ここで、h、v、tはオプションであり、-h -v -tはコマンドラインでオプションを指定する方法です。
- 「h」は値なしのオプションです。
- 'v:'は、オプション-vに値があり、必須オプションであることを意味します。「:」は値があることを意味します。
- 't ::'は、オプション-tには値があるがオプションであることを意味します。'::'はオプションを意味します。
オプションのパラメーターでは、値をオプションで空白で区切ることはできません。したがって、「-t123」の例では、-tはオプション123が値です。
構文:2番目の形式
getopt [getopt_options] [--] [optstring] [parameters]
ここでgetoptが5つの部分に分割された後
- コマンド自体、つまりgetopt
- getopt_optionsは、引数を解析する方法を記述します。単一ダッシュの長いオプション、二重ダッシュのオプション。
- -、getopt_optionsを、解析するオプションと許可された短いオプションから分離します
- 短いオプションは、-が見つかった直後に使用されます。フォームの最初の構文と同じです。
- パラメータ、これらはプログラムに渡したオプションです。解析してオプションに設定された実際の値を取得するオプション。
例
getopt -l "name:,version::,verbose" -- "n:v::V" "--name=Karthik -version=5.2 -verbose"
構文:3番目の形式
getopt [getopt_options] [-o options] [--] [optstring] [parameters]
ここでgetoptが5つの部分に分割された後
- コマンド自体、つまりgetopt
- getopt_optionsは、引数を解析する方法を記述します。単一ダッシュの長いオプション、二重ダッシュのオプション。
- 短いオプション、つまり-oまたは--options。フォームの最初の構文と同じですが、オプション "-o"と "-"(2つのダッシュ)の前にあります。
- -、getopt_optionsを、解析するオプションと許可された短いオプションから分離します
- パラメータ、これらはプログラムに渡したオプションです。解析してオプションに設定された実際の値を取得するオプション。
例
getopt -l "name:,version::,verbose" -a -o "n:v::V" -- "-name=Karthik -version=5.2 -verbose"
GETOPT_OPTIONS
getopt_optionsは、コマンドラインパラメータの解析方法を変更します。
以下はgetopt_optionsの一部です
オプション:-lまたは--longoptions
つまり、getoptコマンドは、複数文字のオプションを認識できるようにする必要があります。複数のオプションはコンマで区切られます。
たとえば--name=Karthik
、コマンドラインで送信される長いオプションです。getoptでは、長いオプションの使用法は
getopt "name:,version" "--name=Karthik"
name:が指定されているため、オプションには値が含まれている必要があります
オプション:-aまたは--alternative
つまり、getoptコマンドでは、長いオプションに2つのダッシュ「-」ではなく1つのダッシュ「-」を使用できるようにする必要があります。
例、代わりに--name=Karthik
単に使用することができます-name=Karthik
getopt "name:,version" "-name=Karthik"
コードを含む完全なスクリプトの例:
#!/bin/bash
# filename: commandLine.sh
# author: @theBuzzyCoder
showHelp() {
# `cat << EOF` This means that cat should stop reading when EOF is detected
cat << EOF
Usage: ./installer -v <espo-version> [-hrV]
Install Pre-requisites for EspoCRM with docker in Development mode
-h, -help, --help Display help
-v, -espo-version, --espo-version Set and Download specific version of EspoCRM
-r, -rebuild, --rebuild Rebuild php vendor directory using composer and compiled css using grunt
-V, -verbose, --verbose Run script in verbose mode. Will print out each step of execution.
EOF
# EOF is found above and hence cat command stops reading. This is equivalent to echo but much neater when printing out.
}
export version=0
export verbose=0
export rebuilt=0
# $@ is all command line parameters passed to the script.
# -o is for short options like -v
# -l is for long options with double dash like --version
# the comma separates different long options
# -a is for long options with single dash like -version
options=$(getopt -l "help,version:,verbose,rebuild,dryrun" -o "hv:Vrd" -a -- "$@")
# set --:
# If no arguments follow this option, then the positional parameters are unset. Otherwise, the positional parameters
# are set to the arguments, even if some of them begin with a ‘-’.
eval set -- "$options"
while true
do
case $1 in
-h|--help)
showHelp
exit 0
;;
-v|--version)
shift
export version=$1
;;
-V|--verbose)
export verbose=1
set -xv # Set xtrace and verbose mode.
;;
-r|--rebuild)
export rebuild=1
;;
--)
shift
break;;
esac
shift
done
このスクリプトファイルを実行します。
# With short options grouped together and long option
# With double dash '--version'
bash commandLine.sh --version=1.0 -rV
# With short options grouped together and long option
# With single dash '-version'
bash commandLine.sh -version=1.0 -rV
# OR with short option that takes value, value separated by whitespace
# by key
bash commandLine.sh -v 1.0 -rV
# OR with short option that takes value, value without whitespace
# separation from key.
bash commandLine.sh -v1.0 -rV
# OR Separating individual short options
bash commandLine.sh -v1.0 -r -V
-s
それを位置引数にします./myscript 45 anystring
。