bashを使用して入力した値がリストにあることを確認してください。

bashを使用して入力した値がリストにあることを確認してください。

私はbashスクリプトに慣れていません。 Bashスクリプトは、呼び出し時に定義されたリストに対してプロンプト値を検証しようとします。

./test.bash [caseyear] [sector]

ケースの年とセクターは、次の試みのbashスクリプトで確認されます。

Validating Year
#1 Check the value of the caseyear Parameter
if [ "$1" -eq "$1" 2> /dev/null ]; then
  if [ $1 -ge 2009 ]; then
    export caseyear=$1
  else
    echo -e "\n\tSpecify [caseyear] value greater than or equal to 2009.\n"
    exit 4
  fi
else
  echo -e "\n\tSpecify [caseyear] value greater than or equal to 2009.\n"
  exit 3
fi

入力した値がセクタリストに存在する必要があることを確認できなかったため、次のスクリプトを試しました。

Validating Sector

#sector list
list_of_sectors="11 40 44_45 52 10_11"

#1 Check if sector value is in the sector list
$ function exists_in_list() {
    LIST=$1
    DELIMITER=$2
    VALUE=$3
    LIST_WHITESPACES=`echo $LIST | tr "$DELIMITER" " "`
    for x in $LIST_WHITESPACES; do
        if [ "$x" = "$VALUE" ]; then
            return 0
        fi
    done
    return 1
}

#2 Check if sector is null
if [ -z "$2" ]; then
    echo -e "\n\tSpecify [caseyear] sector value.\n"
    exit 2
else
  #export omitflag="$(echo $2 | tr '[a-z]' '[A-Z]')" #Convert to upper case
#3 Check if sector value is in the sector list
  export sector

#------------------->Problem Area
#How do I pass the entered $sector value to exists_in_list function that matches with the list, $list_of_sectors?

  if [ $(exists_in_list $list_of_sectors) -ne 0 ] ; then
    echo -e "\n\tSpecify [sector] sector value.\n"
    exit 1
  fi
fi

echo -e "\nYou Specified - CaseYear:$caseyear, Sector:$sector"

ありがとうございます!

ベストアンサー1

これは、次の文を使用して最も簡単に実行できますcase ... esac

#!/bin/sh

caseyear=$1
sector=$2

if [ "$#" -ne 2 ]; then
    echo 'expecting two arguments' >&2
    exit 1
fi

if [ "$caseyear" -lt 2009 ]; then
    echo 'caseyear (1st arg) should be 2009 or larger' >&2
    exit 1
fi

case $sector in
    11|40|44_45|52|10_11)
        # do nothing
        ;;
    *)
        # error
        echo 'sector (2nd arg) is not in list' >&2
        exit 1
esac

printf 'Got caseyear="%s" and sector="%s"\n' "$caseyear" "$sector"

スクリプトは.に固有のものを使用しませんbash。だからインタプリタを/bin/sh

スクリプトが正確に2つのパラメータを取得できない場合は、すぐに終了します。最初のパラメータが数値的に2009以上であることを確認して、それを確認します。|2番目の引数をステートメントの-separatedリストのエントリと一致させて検証しますcase

ステートメントcaseは、次のように少ない行で書くこともできます。

case $sector in
        (11|40|44_45|52|10_11) ;;
        (*) echo 'sector (2nd arg) is not in list' >&2; exit 1 ;;
esac

パターン文字列の開き角かっこは、それぞれの場合にオプションです。最後のケース以降の内容;;もオプションです。

$1そして、両方の変数の初期割り当ては$2少し良くすることができ、両方のパラメータが存在し、空の文字列ではないことを確認する追加のチェックが導入されます。

caseyear=${1:?'1st argument caseyear must be specifiend and not empty'}
sector=${2:?'2nd argument sector must be specified and not empty'}

変数が設定されていないか空の場合、拡張により文字列が${variable:?string}出力されます。これが発生すると、スクリプトはゼロ以外の終了状態で終了します。これにより、正しいテストを削除できます。stringvariable$#

私が知る限り、これら2つの変数をエクスポートする必要はありません。その環境でこれらの変数が必要ないくつかの外部ツールを起動する場合は、次のように外部ツールを実行する前に上記のコードの最後に一度にエクスポートできます。

export caseyear sector
some-other-utility

おすすめ記事