以下のコードは、mwe
私が考える一般的な方法でフラグを立てたスクリプトに基づいています。ところで、とても奇妙な行動が見えます。私が入力したり、パラメータがないと思った場合に返されmwe -e
ます。私が入力するか、そうでないと思うと返されます。 aで終わる4行をコメントアウトすると、コードは期待どおりに機能します。これは、ループが原因で問題が発生したことを示します。何が起こっているのかを説明できる人はいますか?mwe -n
no arg
mwe -k
mwe -i
argType
"-"
breaking
#
while
#!/bin/bash
foo=0
argType=`echo "$1" | cut -c 1`
while [ 1 -gt 0 ] ; #
do #
if [ $# -eq 0 ] ; then
echo no arg
exit
elif [ "$argType" != "-" ] ; then
#No more flags
echo breaking
break #
elif [ "$1" = "-n" ] ; then
foo=1
shift
elif [ "$1" = "-e" ] ; then
foo=2
shift
elif [ "$1" = "-i" ] ; then
foo=3
shift
elif [ "$1" = "-k" ] ; then
foo=4
shift
fi
done #
echo This is foo: $foo
答え1
3行目は次のようになります。
argType=$(printf "%s" "$1" | cut -c 1)
コメントで述べたように、echo
引数(オプションなど)は-e
オプションとして解釈されるため、悪い場合-e
には渡されませんcut
。オプション終了フラグは--
次に使用できません。echo
。その後printf
、とにかく一般的にこれは良いです。
にあるので、bash
@steeldriverの提案を受け取り、パイプの代わりargType=${1:0:1}
に使用できます(つまり、引数1の場合は文字0から始まり1文字を取得します)。ただし、これはPOSIXシェルでは使用できません。
バックティックの代わりにバックティックを好みます$()
。バックティックは、特に入れ子になった場合に読みやすくなるためです。
最後に転送中ですので修正後も試してみると結局./myscript -e -i
事実[ $# -eq 0 ]
となり実行が終了しますのでご注意くださいexit
。意図的かもしれませんが、echo
最終的に最後の問題を引き起こすわけではありません。
答え2
あなたの質問からあなたが望むものが何であるかは明らかではありません!
とにかく、最後のパラメータに対応する数字が欲しいようです。
#!/bin/bash
foo=0;
while [[ $# -gt 0 ]]; do
case "${1}" in
'-n')
foo=1;
shift
;;
'-e')
foo=2;
shift
;;
'-i')
foo=3;
shift
;;
'-k')
foo=4;
shift
;;
*)
echo "Invalid flag";
exit 1;
;;
esac
done
echo "This is foo: $foo"
代わりに、処理前にパラメータを処理して検証するメカニズムが必要な場合は、次のものを使用できます。
#!/bin/bash
inputf='';
outputf='';
text='';
format='';
while [[ $# -gt 0 ]];do
case "${1}" in
'-i')
inputf="${2}";
shift 2
;;
'-o')
outputf="${2}";
shift 2
;;
'-t')
text="${2}";
shift 2
;;
'-f')
format="${2}";
shift 2
;;
esac
done