以下のコードは、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
最終的に最後の問題を引き起こすわけではありません。