0

エコーの引数リストが長すぎるという問題が発生しているので、この問題を回避する方法、または少なくとも条件をテストして適切に処理できるようにする方法についていくつかのアイデアが必要です。脚本

for file in `cat filelist`; do 
    PROTOCOLS1=`egrep -i 'rsh|rsync|remsh' "$file" | egrep -v '^[ |      ]*#'`
    FIELDS=`echo $PROTOCOLS1|wc -l`
    if [[ $FIELDS -gt 1024 ]]; then
        echo $file >> $debuglog
    else
        set -A myarray $PROTOCOLS1
        do stuff.....
    fi
done

したがって、問題は、echoのargリストが長すぎる場合、$FIELDSnullに設定されるため、のテストが$FIELDS -gt 1024常にtrueになり、キャッチされないことです。問題は、配列に移動すると明らかに大きすぎて、添え字が範囲外のエラーになり、スクリプトが終了することです。

どんなアイデアでも大歓迎です。


9/18を編集

OK、問題はもう少し基本的です。

myserver-v1> echo $variable
myserver-v1> /usr/bin/echo: too many args

スクリプトでこれをテストしたい

私は次のことを試しましたが、これは機能しますが、このすべてのがらくたをstdoutに取得します。これにより、デバッグログがいっぱいになり、煩わしくなります。

echo $variable
if [[ $? -ne 0 ]]; then
write to error log
fi

stdoutに送信せずにecho$variableをテストする方法はありますか?以下を試してみましたが、どちらもうまくいかなかったので、ちょっと戸惑いました。

[[ ! `echo $variable ]]
[[ `echo $variable ]]
4

1 に答える 1

1

引用符で囲まれていない変数を に保持すると$PROTOCOLS1、次のようechoに置き換えることで生活を簡素化できます。

FIELDS=`echo $PROTOCOLS1|wc -l`

FIELDS=1

これは、$PROTOCOLS1引用符を付けずにエコーすると、出力が 1 行 (おそらく非常に長い) だけになるためです。または、次を使用できます。

FIELDS=$(echo "$PROTOCOLS1" | wc -l)

ここで、二重引用符は PROTOCOLS1 の値に改行を保持します (ただし、「引数リストが長すぎる」問題に戻ります)。

したがって、次の使用について考える必要があります。

FIELDS=$(egrep -i 'rsh|rsync|remsh' "$file" | egrep -c -v '^[ |      ]*#')

egrepこれにより、行カウントを行う秒が取得されます。明らかに、スクリプトの後半では を使用しているため、データを取得$PROTOCOLS1するには を再評価する必要がありますがegreps、処理スキームが適切かどうかを検討する必要があります。長すぎる文字列値に遭遇した場合、おそらく最適な方法で処理を行っていません。代替手段は何をしようとしているのかによって異なり、質問はそれを明らかにしていません。Perl、Python、Ruby などのスクリプト言語を使用して追加の処理を行うことが適切な場合があります。

于 2012-09-13T20:52:36.983 に答える