0

このプログラムは、最初の関数である read-series を呼び出し、while ループのすべての反復の入力を偶数オッズ関数に渡します。この関数は、数値が偶数か奇数かを判断し、VARSUMODDS=VARSUMODDS+ の値を作成します。奇数だった場合は入力するか、VARPRODUCTEVENS=VARSUMEVENS*入力の値にします。次に、それらを印刷します。ここには千の構文エラーがあると確信しているので、残忍にしてください。私はこの言語を学び始めたばかりで、数日前に C++ と Java しか知らなかったので、複雑な答えを理解できるとは思わないでください。ありがとう!

#! /bin/bash
TMPDIR=${HOME}/tmpdir
echo "Enter an integer: "
VARSUMODDS=0
VARPRODUCTEVENS=0
function read-series() {
    while read numbers ; do
        echo "Enter an integer: "
        even-odds $numbers
    done
    echo numbers > $TMPDIR/$$.temp
    return 0;
}

function even-odds() {

    evenp=$(( $1 % 2 ))
    if [ $evenp -eq 0 ] ; then
        $VARPRODUCTEVENS=$(($VARPRODUCTEVENS * $1))
        return 0;
    else
        $VARSUMODDS=$(($VARSUMODDS + $1))
        return 1;
    fi
}
function reduce () {
    echo -n "Sum of odds: "
    echo VARSUMODDS
    echo -n "Product of evens: "
    echo VARPRODUCTEVENS
    return 0;
}

read-series
4

3 に答える 3

1
  1. VARPRODUCTEVENS何かを 0 で乗算すると 0 になるため、1 に初期化する必要があります。
  2. $代入ステートメントで代入される変数の前に置くべきではありません。
  3. -pオプションを使用しreadてプロンプトを指定できます
  4. $$.tempループが完了した後に書き込みを行っています。numbersその場合は空になるので、ファイルには何も書き込んでいません。入力されたすべての数字を記録したい場合は、ループ内でそれ>>を行い、ファイルを上書きするのではなく、 を使用してファイルに追加する必要があります。
  5. 関数で使用する理由はありませreturnん。終了ステータスをテストするものは何もありません。通常、0 以外の値は、エラーが発生したことを意味します。
  6. 結果を出力する関数を定義しましたreduceが、呼び出したことはありません
  7. $すべての行で変数名の前に置く必要がありますecho
  8. function関数定義の前に置かないでください。許可されていますが、必須ではなく、移植性もありません (bash 拡張機能です)。
#! /bin/bash
TMPDIR=${HOME}/tmpdir
VARSUMODDS=0
VARPRODUCTEVENS=1
read-series() {
    while read -p "Enter an integer: " numbers ; do
        even-odds $numbers
        echo $numbers >> $TMPDIR/$$.temp
    done
}

even-odds() {

    evenp=$(( $1 % 2 ))
    if [ $evenp -eq 0 ] ; then
        VARPRODUCTEVENS=$(($VARPRODUCTEVENS * $1))
    else
        VARSUMODDS=$(($VARSUMODDS + $1))
    fi
}
reduce () {
    echo ''
    echo -n "Sum of odds: "
    echo $VARSUMODDS
    echo -n "Product of evens: "
    echo $VARPRODUCTEVENS
}

read-series
reduce
于 2013-09-27T17:38:00.090 に答える
1

このスクリプトをスタンドアロンで実行する場合は、CTRL-d で入力を終了する必要があります。問題は次のとおりです。

VARPRODUCTEVENS=0 

である必要があります

VARPRODUCTEVENS=1

または、製品は常にゼロになります。

echo numbers > $TMPDIR/$$.temp

有用な目的はないようです。文字列「numbers」をファイルに入れています。$numbers を使用しても、目的がないように見えます。読み取りからの最後の単一の番号をファイルに入れます。使い方からすると、「数字」よりも「数字」の方がいい名前かもしれません。

    $VARPRODUCTEVENS=$(($VARPRODUCTEVENS * $1))

    $VARSUMODDS=$(($VARSUMODDS + $1))

である必要があります

    VARPRODUCTEVENS=$(($VARPRODUCTEVENS * $1))

    VARSUMODDS=$(($VARSUMODDS + $1))

割り当ての左側に $VARSUMODDS があると、「1」という名前の変数 ($VARSUMODDS の値) に割り当てようとします。

reduce の呼び出しがないため、結果は表示されません。最後にそれを望んでいると思います。

return ステートメントは不要であり、意図したことを実行していない可能性があります。基本的に終了ステータスを設定しており、ゼロ以外は失敗を意味します。

于 2013-09-27T18:09:01.383 に答える