Whileステートメント:複数の条件を複合的に使用することはできません。

Whileステートメント:複数の条件を複合的に使用することはできません。

パターンを介してパラメータを解析しようとしていますrecursive descent

これらの文は、各実行後に次の手順を実行するためにwhile関数を呼び出します。eat!$current_token

今問題は無限ループに入ることです。

正確に言えば、関数には2つのwhileループがあります。

複合語が文法的(または論理的に?)間違っているため、どちらか一方または両方が機能しません。

さまざまなレベルで発生する可能性のある問題について、次のコードを確認してください。

1)

while $(isWord? $current_token) || ! $(isVersionNumber? $current_token) && ! $(endOfInput?); do
while isVersionNumber? $current_token && ! endOfInput?; do

また何が正しいですか?コマンドの置き換えにチェック機能を追加しますか?

短絡によりendOfInput?テストも防止できませんか?

なぜなら、それは明らかにサイクルを停止しなければならないからです。

イルカチュウのお願いで

テスト機能コード:

isWord? () {
    local pattern="^[a-zA-Z0-9_-]+$"
    if [[ $1 =~ $pattern ]]; then
        echo true
    else
        echo false
    fi
}

isVersionNumber? () {
    local pattern="^[0-9]{1,2}(\.[0-9]{,2})*$"
    if [[ $1 =~ $pattern ]]; then
        echo true
    else
        echo false
    fi
}

EO_ARGS=1

function endOfInput? {
 if [ $current_token_index -ge $ARGC ]; then
    EO_ARGS=0
 fi
 echo $EO_ARGS
}

コマンドの置き換えに使用しているので、別のコマンドを出力するとしますか?

いいえ、コマンド置換を使用せずに条件付きで関数を呼び出すことが可能かどうかわからないため、これは単なる試みです。

eat!完璧にするために、この機能も追加しました。

eat! () {
    
if [[ ! $(($current_char_index + 1)) -gt $ARGC ]]; then
  current_token=${ARGV[$current_token_index]}
  ((current_token_index += 1))

  current_char=${current_token:0:1}
}

test/ [()を使用すると、条件を[[よりよく表現できますか?

感嘆符は失敗ポイントになることができますか?

以下は構文上間違っているようです。

while [ endOfInput -eq 1 ] && isWord? "$current_token" || ! isVersionNumber? "$current_token"; do

括弧で[エラーメッセージが表示されます。

[: endOfInput: integral expression expected (translation)

ベストアンサー1

関数がtrueの場合は0を返し、falseの場合は別の値を返す場合は直接使用できます。

my-true () {
    return 0
}

while my-true ; do
    echo Infinite loop...
done

false は何も出力しませんが、 true は何かを出力する場合はコマンド置換を使用します。

my-true () {
    echo OK
}
while [ "$(my-true)" ] ; do
    echo Infinite loop...
done

前者の場合、関数を連結するには、&&演算子||を使用できます。

while func1 && func2 ; do

後者の場合は、代わりに接続を使用できます||

while [ "$(func1 ; func2)" ] && [ "$(func3)" ]

後者の場合、サブシェルから呼び出されるため、関数のグローバル変数を変更することはできません。

ただし、関数名に使用することは?禁止されていませんが、ワイルドカードなので問題が発生する可能性があります。

abc? () {
    return $1
}
abc? 0   # Everything OK.
touch abcX
abc? 0   # line 9: ./abcX: Permission denied
abc\? 0  # This works, but where's the charm?

!デフォルトの歴史的拡張文字ですが、主に対話型シェルにのみ関連しています。

おすすめ記事