私は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}
出力されます。これが発生すると、スクリプトはゼロ以外の終了状態で終了します。これにより、正しいテストを削除できます。string
variable
$#
私が知る限り、これら2つの変数をエクスポートする必要はありません。その環境でこれらの変数が必要ないくつかの外部ツールを起動する場合は、次のように外部ツールを実行する前に上記のコードの最後に一度にエクスポートできます。
export caseyear sector
some-other-utility