web-dev-qa-db-ja.com

bash ---フラグと予想される(オプションではない)引数を解析します

$ bash file.sh expected_arg -f optional_arg

$1を使用して最初の引数を取得することを目的とした投稿を見たことがあります

フラグ引数を解析するためにgetoptsを使用してアドレス指定する投稿。私は両方に対処する投稿を見たことがありません。

現在、expected_arg経由で$1にアクセスしています。

-fフラグをまったく処理できません。テストスクリプトにもこれがありますが、

#!/bin/bash

dirname=$1

[[ -z  $dirname  ]] && echo "Project name required as an argument." && return

# get flags
verbose='false'
aflag='false'
bflag='false'
files='false'
while getopts 'abf:v' flag; do
  case "${flag}" in
    a) aflag='true' ;;
    b) bflag='true' ;;
    f) files="${OPTARG}" ;;
    v) verbose='true' ;;
    *) error "Unexpected option ${flag}" ;;
  esac
done

echo "$files"

echo "$HOME/Desktop/$dirname"

exit

ターミナルには次のように表示されます。

Jills-MBP:~ jillr$ bash test.sh blah -f file
false
/Users/jillr/Desktop/blah

ただし次のように引数の順序を切り替えます。

bash file.sh -f optional_arg expected_arg

端末が出力するもの:

Jills-MBP:~ jillr$ bash test.sh -f file blah
file
/Users/jillr/Desktop/-f

当然、-fは$1として処理されますが、これは私が望んでいることではありません。私はexpected_argをつかむ必要があります

必要な制約:

  • さまざまな数のフラグを許可する必要があります(まったくないものからいくつかのものまで)。したがって、expected_argの位置は異なります
  • expected_argは必須です
  • むしろ、expected_argを解析するために別のフラグを使用する必要はありません(たとえば、$ bash test.sh -f file -d blahのようなことは避けたいです)

どうすればこれらの制約を満たすことができますか?

1
user243760

気にしないで。私はこの投稿を見つけました: オプション以外の引数の後にgetoptsを使用してオプションを解析する

これは基本的に、dirname = $ 1の後にshiftを配置するだけで問題を解決できると言っています

これにより、引数を次のように入力できます

$ bash file.sh expected_arg -f optional_arg
4
user243760