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

Bash シェル スクリプト - フラグをチェックしてその値を取得する

shFlags を試してみてください -- Unix シェル スクリプト用の高度なコマンドライン フラグ ライブラリです。

http://code.google.com/p/shflags/

それは非常に優れており、非常に柔軟です。

フラグの種類:これは、実行できる DEFINE_* のリストです。すべてのフラグは、名前、デフォルト値、ヘルプ文字列、およびオプションの「短い」名前 (1 文字の名前) を取ります。一部のフラグには他の引数があり、フラグで説明されています。

DEFINE_string:任意の入力を受け取り、それを文字列として解釈します。

DEFINE_boolean:通常は引数を取りません:--myflag と指定して FLAGS_myflag を true に設定するか、--nomyflag と指定して FLAGS_myflag を false に設定します。あるいは、--myflag=true または --myflag=t または --myflag=0 と指定することもできます。または --myflag=false または --myflag=f または --myflag=1 オプションを渡すと、オプションを 1 回渡すのと同じ効果があります。

DEFINE_float:入力を受け取り、それを浮動小数点数として解釈します。 Asshell は float 自体をサポートしていません。入力は有効な浮動小数点値として検証されるだけです。

DEFINE_integer:入力を受け取り、それを整数として解釈します。

特別なフラグ:特別な意味を持つフラグがいくつかあります:--help (または -?) は、人間が読める形式ですべてのフラグのリストを出力します --flagfile=foo foo からフラグを読み取ります。 (まだ実装されていません)-- getopt() と同様に、フラグ処理を終了します

使用例:

-- begin hello.sh --
 ! /bin/sh
. ./shflags
DEFINE_string name 'world' "somebody's name" n
FLAGS "[email protected]" || exit $?
eval set -- "${FLAGS_ARGV}"
echo "Hello, ${FLAGS_name}."
-- end hello.sh --

$ ./hello.sh -n Kate
Hello, Kate.

注:このテキストは shflags のドキュメントから引用しました


これは、すべてのスクリプトの先頭に貼り付けることができる、一般化された単純なコマンド引数インターフェイスです。

#!/bin/bash

declare -A flags
declare -A booleans
args=()

while [ "$1" ];
do
    arg=$1
    if [ "${1:0:1}" == "-" ]
    then
      shift
      rev=$(echo "$arg" | rev)
      if [ -z "$1" ] || [ "${1:0:1}" == "-" ] || [ "${rev:0:1}" == ":" ]
      then
        bool=$(echo ${arg:1} | sed s/://g)
        booleans[$bool]=true
        echo \"$bool\" is boolean
      else
        value=$1
        flags[${arg:1}]=$value
        shift
        echo \"$arg\" is flag with value \"$value\"
      fi
    else
      args+=("$arg")
      shift
      echo \"$arg\" is an arg
    fi
done


echo -e "\n"
echo booleans: ${booleans[@]}
echo flags: ${flags[@]}
echo args: ${args[@]}

echo -e "\nBoolean types:\n\tPrecedes Flag(pf): ${booleans[pf]}\n\tFinal Arg(f): ${booleans[f]}\n\tColon Terminated(Ct): ${booleans[Ct]}\n\tNot Mentioned(nm): ${boolean[nm]}"
echo -e "\nFlag: myFlag => ${flags["myFlag"]}"
echo -e "\nArgs: one: ${args[0]}, two: ${args[1]}, three: ${args[2]}"

コマンドを実行:

bashScript.sh firstArg -pf -myFlag "my flag value" secondArg -Ct: thirdArg -f

出力は次のようになります:

"firstArg" is an arg
"pf" is boolean
"-myFlag" is flag with value "my flag value"
"secondArg" is an arg
"Ct" is boolean
"thirdArg" is an arg
"f" is boolean


booleans: true true true
flags: my flag value
args: firstArg secondArg thirdArg

Boolean types:
    Precedes Flag(pf): true
    Final Arg(f): true
    Colon Terminated(Ct): true
    Not Mentioned(nm): 

Flag: myFlag => my flag value

Args: one => firstArg, two => secondArg, three => thirdArg

基本的に、引数はフラグ ブール値とジェネリック引数に分割されます。このようにすることで、ユーザーは、ジェネリック引数 (存在する場合) を指定された順序で保持している限り、フラグとブール値をどこにでも配置できます。

私とあなたが bash 引数の解析に二度と対処しないようにします!

ここで更新されたスクリプトを表示できます

これは昨年、非常に役に立ちました。変数の前にスコープ パラメーターを付けることで、スコープをシミュレートできるようになりました。

次のようにスクリプトを呼び出すだけです

replace() (
  source $FUTIL_REL_DIR/commandParser.sh -scope ${FUNCNAME[0]} "[email protected]"
  echo ${replaceFlags[f]}
  echo ${replaceBooleans[b]}
)

引数のスコープを実装したようには見えませんが、まだ必要ではない理由がわかりません.


$# を使用 引数の数を取得します。2 に等しくない場合は、十分な引数が提供されていません:

if [ $# -ne 2 ]; then
   usage;
fi

次に、$1 かどうかを確認します -t に等しい 、それ以外の場合は不明なフラグが使用されました:

if [ "$1" != "-t" ]; then
  usage;
fi

最後に $2 を保存します FLAG で :

FLAG=$2

注:usage() 構文を示す関数です。例:

function usage {
   cat << EOF
Usage: script.sh -t <application>

Performs some activity
EOF
   exit 1
}

この getopts チュートリアルを読む必要があります。

-a の例 引数が必要なスイッチ:

#!/bin/bash

while getopts ":a:" opt; do
  case $opt in
    a)
      echo "-a was triggered, Parameter: $OPTARG" >&2
      ;;
    \?)
      echo "Invalid option: -$OPTARG" >&2
      exit 1
      ;;
    :)
      echo "Option -$OPTARG requires an argument." >&2
      exit 1
      ;;
  esac
done

グレイボットが言ったように(getopt !=getopts ) :

<ブロック引用>

知らない場合を除き、外部コマンド getopt(1) を安全に使用することはできません。 それは GNU getopt であり、GNU 固有の方法で呼び出し、および GETOPT_COMPATIBLE が環境にないことを確認します。代わりに getopts (shellbuiltin) を使用するか、単純に位置パラメータをループしてください。


Linux
  1. 関数とパラメータを変数として持つシェルスクリプト?

  2. 一致する`"‘を探しているときに予期しないEof – Bashスクリプト?

  3. Linux シェル スクリプトまたは変数の日付と時刻の書式設定

  1. シェルスクリプトとメイクファイルの命名規則

  2. Bash スクリプト:セッションをログに記録するための bash スクリプトからのスクリプト コマンドの使用

  3. 引数が bash シェルで有効な日付かどうかを確認する

  1. スクリプト内の bash シェル スクリプトおよび関数の変数スコープ

  2. ファイルがbashスクリプトの特定のディレクトリに存在するかどうかを確認するには?

  3. bash スクリプトへのパラメータのいずれかが文字列と一致するかどうかを確認します