スクリプトには、ユーザー入力が必要なオプションのリストがあります。
彼ら
-c cell name
->必ずそこにいるでしょう
-n node
->必ずそこにいるでしょう
-s server
->必ずそこにいるでしょう
ここまではすべてが正常です。ここまでのコードは次のとおりです。while getopts c:n:s:
問題はここから始まります
および/または条件に入力する必要がある2つの異なるフィールドがあります。
-i initial heap size
-m max heap size
ユーザーはオプションの一方または両方を入力します。
現在私は次のようなものを持っています
#get the arguments -c for cell, -n for node, -s for server, -i for initial heap, -m for max heap
while getopts c:n:s:im opt; do
case $opt in
c)
CELL=$OPTARG
;;
n)
NODE=$OPTARG
;;
s)
SERV=$OPTARG
;;
i)
INI_HEAP=$OPTARG
;;
m)
MAX_HEAP=$OPTARG
;;
?)
echo "a.sh -c <CELL> -n <NODE> -s <SERVER> [-i <INITAIL HEAP> | -m <MAX HEAP>"
;;
esac
done
#test if cell name is not null
if ! test "$CELL" || ! test "$NODE" || ! test "$SERV" ; then
echo "a.sh -c <CELL> -n <NODE> -s <SERVER> [-i <INITAIL HEAP> | -m <MAX HEAP>]"
exit 1
fi
#test if both initial heap and max heap are null
flag=0
if ! test "$INI_HEAP" ; then
if ! test "$MAX_HEAP" ; then
flag=1;
fi
fi
if [[ $flag -eq 1 ]] ; then
echo "flag a.sh -c <CELL> -n <NODE> -s <SERVER> [-i <INITAIL HEAP> | -m <MAX HEAP>]"
exit 1
fi
#test for non numeric value of initial heap size
if [[ "$INI_HEAP" == +([0-9]) ]] ; then
continue
else
echo "num a.sh -c <CELL> -n <NODE> -s <SERVER> [-i <INITAIL HEAP> | -m <MAX HEAP>]"
exit 1
fi
-i
機能とオプションを実装するにはどうすればよいですか-m
?
答え1
変数$flag
が重複しています。変数を設定してすぐにテストします。最初に設定するのではなく、エコーをするだけです。したがって、ロジックは次のようになります。
- キャプチャオプション/optargs
- CELL、NODE、SERVERがすべて設定されていることを確認してください。
- INI_HEAPまたはMAX_HEAPが設定されていてintであることを確認してください。
#get the arguments -c for cell, -n for node, -s for server, -i for initial heap, -m for max heap
while getopts c:n:s:i:m: opt; do
case $opt in
c)
CELL=$OPTARG
;;
n)
NODE=$OPTARG
;;
s)
SERV=$OPTARG
;;
i)
INI_HEAP=$OPTARG
;;
m)
MAX_HEAP=$OPTARG
;;
?)
echo "Usage: a.sh -c <CELL> -n <NODE> -s <SERVER> [-i <INITIAL HEAP> | -m <MAX HEAP>]"
exit 1
;;
esac
done
#test if cell name is not null
if [[ -z "$CELL" || -z "$NODE" || -z "$SERV" ]]; then
echo "Cell, Node and Server are mandatory values"
echo "Usage: a.sh -c <CELL> -n <NODE> -s <SERVER> [-i <INITIAL HEAP> | -m <MAX HEAP>]"
exit 1
fi
#make sure either -i or -m was used (or both) and is an integer
shopt -s extglob
if [[ ( -z "$INI_HEAP" && -z "$MAX_HEAP" ) || -n "${INI_HEAP##+([0-9])}" || -n "${MAX_HEAP##+([0-9])}" ]]; then
echo "Initial heap size or maximum heap size (or both) must be specified, and must be an integer"
exit 1
fi
shopt -u extglob
答え2
getoptsケースセクションの前にINI_HEAPとMAX_HEAPのデフォルト値を追加します。デフォルト値はハードコードされた値であるか、最初にシステム内のメモリ量を確認し、デフォルト値としてパーセンテージ値を提供するスマート値の一種です。