独自のオプション解析を行う方法は様々な方法が考えられますが、case文を利用するのが依存関係が特になく手軽な方法だと考えられます。
Bashで独自のオプション解析の例になります。
以下は引数をfor文で処理してオプションを解析していく方法になります。
補足情報として、local -aは配列の宣言になります。local -Aは連想配列の宣言になります。
このプログラムは連想配列を利用して、オプションの結果を表示しています。
options_analyze.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
#!/bin/bash function main(){ local -a key=(a b c d) local -A table=() local -a progarg=() # オプションのデフォルト値 table+=([a]=false) table+=([b]=false) table+=([c]=false) table+=([d]=false) # オプションを解析する for arg in "$@"; do case $arg in -a) table[a]=true ;; -b) table[b]=true ;; -c) table[c]=true ;; -d) table[d]=true ;; *) progarg+=("$arg") ;; esac done # オプションの解析結果を処理する for optchar in "${key[@]}"; do echo "$optchar: ${table[$optchar]}" done echo "==program args==" for arg in "${progarg[@]}"; do echo "$arg" done } main "$@" |
このプログラムの実行結果は以下のようになります。
実行結果
1 2 3 4 5 6 7 8 9 |
$ bash options_analyze.sh -a aa bb cc -c -d a: true b: false c: true d: true ==program args== aa bb cc |
while文とshiftコマンドでコマンドライン引数を解析
while文とshiftコマンドを利用して引数を処理する方法も考えられます。
options_analyze2.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
#!/bin/bash function main(){ local -a key=(a b c d) local -A table=() local -a progarg=() # オプションのデフォルト値 table+=([a]=false) table+=([b]=false) table+=([c]=false) table+=([d]=false) # オプションを解析する while [[ $# > 0 ]]; do case "$1" in -a) table[a]=true shift ;; -b) table[b]=true shift ;; -c) table[c]=true shift ;; -d) table[d]=true shift ;; *) progarg+=("$1") shift ;; esac done # オプションの解析結果を処理する for optchar in "${key[@]}"; do echo "$optchar: ${table[$optchar]}" done echo "==program args==" for arg in "${progarg[@]}"; do echo "$arg" done } main "$@" |
実行結果は以下のようになります。
実行結果
1 2 3 4 5 6 7 8 9 |
$ bash options_analyze2.sh -a aa bb cc -c -d a: true b: false c: true d: true ==program args== aa bb cc |