GNU/Linux >> Linux の 問題 >  >> Linux

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のようなことは避けたいです。 )

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

承認された回答:

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

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

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

$ bash file.sh expected_arg -f optional_arg

Linux
  1. BashForループガイドと例

  2. Bashでは、いつエイリアスを作成し、いつスクリプトを作成し、いつ関数を作成するのですか?

  3. &&および||後のBashラインの継続文書化されていますか?

  1. Bash の For ループと While ループの例

  2. BashでCSVファイルを解析するには?

  3. Bash while ループで and を使用する

  1. bash 引数で引用符を保持する

  2. bash と ksh のサブシェルの違い

  3. #!/usr/bin/env bash と #!/usr/bin/bash の違いは何ですか?