オプションフラグを持つ Bash スクリプトが一貫して動作しません。

オプションフラグを持つ Bash スクリプトが一貫して動作しません。

以下のコードは、mwe私が考える一般的な方法でフラグを立てたスクリプトに基づいています。ところで、とても奇妙な行動が見えます。私が入力したり、パラメータがないと思った場合に返されmwe -eます。私が入力するか、そうでないと思うと返されます。 aで終わる4行をコメントアウトすると、コードは期待どおりに機能します。これは、ループが原因で問題が発生したことを示します。何が起こっているのかを説明できる人はいますか?mwe -nno argmwe -kmwe -iargType"-"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最終的に最後の問題を引き起こすわけではありません。

おすすめ記事