2

私の現在のスクリプトは次のことを行います。

コマンドライン引数として整数を取り、1からNで始まり、数値が3、5、またはその両方で割り切れるかどうかをチェックします。Ucを3、Besを5、UcBesを3,5と出力するだけです。コマンドライン引数が空の場合、同じ操作を実行しますが、ループは1から20になります。

「11、15、19行目の引数が多すぎます」というエラーが発生します。

コードは次のとおりです。

#!/bin/bash

if [ ! -z $1 ]; then
    for i in `seq 1 $1`
    do
        if [ [$i % 3] -eq 0 ]; then
            echo "Uc"
        elif [ i % 5 -eq 0 ]; then
            echo "Bes"
        elif [ i % 3 -eq 0 ] && [ i % 5 -eq 0 ]
        then
            echo "UcBes"
        else
            echo "$i"
        fi
    done
elif [ -z $1 ]
then
    for i in {1..20}
    do
        if [ i % 3 -eq 0 ]
        then
            echo "Uc"
        elif [ i % 5 -eq 0 ]
        then
            echo "Bes"
        elif [ i % 3 -eq 0 ] && [ i % 5 -eq 0 ]
        then
            echo "UcBes"
        else
            echo "$i"
        fi
    done
else
    echo "heheheh"
fi
4

3 に答える 3

6

これ[は実際にtestはシェルの組み込みの同義語であり(which [端末で試してください)、他の言語のような条件付き構文ではないため、次のことはできません。

if [ [$i % 3] -eq 0 ]; then

[さらに、 、]、およびそれらの間に論理条件チェックを構成する変数の間に少なくとも 1 つのスペースがあることを常に確認してください。

modulo などの式を評価するための構文は で囲み$((...))、内部の変数名に接頭辞を付ける必要はありません$

remainder=$((i % 3))
if [ $remainder -eq 0 ]; then
于 2012-11-15T20:49:47.047 に答える
3

おそらく次のようなものを使用する必要があります。

if [ $(($i % 3)) -eq 0 ]

それ以外の

if [ $i % 3 -eq 0 ]
if [ [$i % 3] -eq 0 ]
于 2012-11-15T20:50:15.960 に答える
1

スクリプトを大幅に簡素化できます。例えば:

#!/bin/sh

n=0
while test $(( ++n )) -le ${1:-20}; do
  t=$n
  expr $n % 3 > /dev/null || { printf Uc; t=; }
  expr $n % 5 > /dev/null || { printf Bes; t=; }
  echo $t
done

引数が整数でない場合は、わずかに異なるエラー メッセージが表示されますが、それ以外の場合は同じように動作します。

于 2012-11-15T22:29:27.580 に答える