0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【Bash】getopts が関数内で動かないときはトップレベルの $@ を関数内に持ち込めばいい

0
Last updated at Posted at 2020-04-21

問題の説明

Bash で実行したスクリプトで、関数内で getopts を実行したが思ったように動かない。
これが起きるのは、例えば、スクリプトの引数を解釈する部分を関数に切り出したい場合:

動かない.sh
parse() {
  while getopts "abc" OPT
  do
    処理...
  done
}

parse

これは思ったように動かない。

原因

getopts はデフォルトで $@ もしくは $1, $2, ... に相当するものを引数リストとみなして解析する。
これは関数内では 関数の引数 であって、スクリプトの引数ではない ので、期待通りに動かないのであった。

解決方法

  • 【方法1】getopts は第3引数以降に引数リストを指定することができて、その場合は指定した引数リストが解析される。なので、スクリプトのトップレベルで、スクリプトの引数を変数に入れ、それを getopts で指定すればよい:

    方法1.sh
    parse() {
      while getopts "abc" OPT argv; do
        処理...
      done
    }
    
    argv=$@  # 配列変数 argv にスクリプト引数のリストを代入
    parse
    

    ただし変数スコープ的に気に入らない人もいると思う。その場合は次の方法をとる。

  • 【方法2】トップレベルの $@ を関数の引数として渡す。この場合、関数に独自の引数を設定することはできないと思う:

    方法2.sh
    parse() {
      while getopts "abc" OPT; do
        処理...
      done
    }
    
    parse $@
    

さいごに

シェルあまり詳しくないので、間違いや改善点がありましたら教えて下さい。

0
1
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
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?