1

たとえば、単純な for/if ステートメントのみを使用して、数値のペアを追加するスクリプトを作成しようとしています。

./pair 1 2 4 8 16

結果として

./pair 1 2 4 8 16 32
3
12
48

私の現在のスクリプトは次のとおりです(おそらく非常に間違っています。シェルスクリプトは初めてです):

#!/bin/sh

sum=0
count=0

for a in $*
do
    sum=`expr $sum + $a`
    count=`expr $count + 1`

    if [ count=2 ]
        then
        sum=0
        count=0
    fi

    echo "$sum"

done

exit 

ただし、これは機能していません。どんな助けでも素晴らしいでしょう。

4

5 に答える 5

3

ループは、これforに適したツールではありません。whileループとshiftコマンドを使用します。

while [ $# -gt 1 ]; do
    echo $(( $1 + $2 ))
    shift 2
done

スクリプトの問題は、ステートメントに十分な空白がないことifと、変数名の前に$:

if [ $count = 2 ]

また、$sumループのたびにではなく、値を 0 にリセットする直前にのみ出力する必要があります。

そして、expr算術にはもう必要ありません:sum=$(( sum + a ))

于 2013-10-29T13:44:49.777 に答える
0

したがって、shebangs は bourne シェルをインプライし、スクリプトを直接開始すると、次のようになります。

/bin/sh <your_script_name>

そして、私が考えることができる最も単純なループはこれです:

while [ $# -gt 1 ]; do
  expr $1 + $2
  shift 2
done

入力トークンをカウントし、2 つ以上 (角括弧テスト) がある限り、最初と 2 番目のトークンを追加して結果を表示します。shift 2入力を 2 桁シフトすることを意味します (つまり、$1 と $2 は削除され、$n は $n-2 にマップされます)。

于 2013-10-29T13:48:33.963 に答える
0

私のアプローチでは cshell を使用します。C プログラマーとして、私は cshell とよりよくつながります。しかし、それはさておき、私は 2 回インクリメントするイテレータを使用して問題に取り組みます。

@ i = 1
while ( $i < $#argv )
  @ j = $i + 1
  @ sum = $argv[$i] + $argv[$j]
  echo $sum
  @ i = $i + 2
end
于 2013-10-29T13:37:08.610 に答える
0

面白いsh/bcコンボ ソリューションが必要な場合:

#!/bin/sh
printf "%s+%s\n" "$@" | bc

それはクールですprintf、ループ自体を処理します。:)

もちろん、エラーチェックは一切ありません!フロートでも機能します。

と同じdc

#!/bin/sh
printf "%s %s+pc" "$@" | dc

ただし、負の数では機能しません。負の数の場合、次のことができます。

#!/bin/sh
printf "%s %s+pc" "${@/-/_}" | dc

そして、これが最短の答えだと気づきました!

于 2013-10-31T13:37:49.837 に答える