2

最近、同じオペレーティング システムである FreeBSD 8.2 で動作する新しい専用サーバーに移行しました。root アカウントへのアクセス権があり、すべての権限が適切に設定されています。

私の問題は、古いサーバーで実行していた bash スクリプトが新しいマシンで機能しないことです。スクリプトの実行中に表示される唯一のエラーは次のとおりです。

# sh script.sh
script.sh: 3: Syntax error: word unexpected (expecting ")")

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

#!/usr/local/bin/bash

PORTS=(7777:GAME 11000:AUTH 12000:DB)
MESSG=""
for i in ${PORTS[@]} ; do
    PORT=${i%%:*}
    DESC=${i##*:}
    CHECK=`sockstat -4 -l | grep :$PORT | awk '{print $3}' | head -1`
    if [ "$CHECK" -gt 1 ]; then
        echo $DESC[$PORT] "is up ..." $CHECK
    else
        MESSG=$MESSG"$DESC[$PORT] wylaczony...\n"
        if [ "$DESC" == "AUTH" ]; then
            MESSG=$MESSG"AUTH is down...\n"
        fi
        if [ "$DESC" == "GAME" ]; then
            MESSG=$MESSG"GAME is down...\n"
        fi
        if [ "$DESC" == "DB" ]; then
            MESSG=$MESSG"DB is down...\n"
        fi

    fi
done

if [ -n "$MESSG" ]; then
    echo -e "Some problems ocurred:\n\n"$MESSG | mail -s "Problems" yet@another.com
fi

私は実際には bash でコーディングしていないので、なぜこれが起こったのかわかりません...

4

4 に答える 4

2

Bourne シェル ( sh) は配列をサポートしていません。そのため、使用時にこのエラーが発生しています。

sh script.sh

bash代わりに使用

bash script.sh

:そこにリンクされているsh script.shため、古いサーバーで機能したと思われます。shbash

于 2012-10-20T23:13:48.303 に答える
1

また、それを実行する必要はありませんsh(それ #! が最初の行の目的です-OSは行の残りをコマンドとして実行し、解釈するファイルの内容を渡します)。スクリプトを実行可能 にするだけで、名前の前にchmod +x script.sh なくても直接実行できます。sh

デフォルトのシェルがbashではない可能性があるため、それを実行するshと、別のシェルで解釈され、エラーが発生します

于 2012-10-20T17:17:35.550 に答える
0

コードはよさそうだ。新しい専用サーバーは、最後のサーバーよりも古いバージョンのBashを実行している可能性があります。または、/ usr / local / bin/bashが古いバージョンを指している可能性があります。

走る

$どのbash

それ以外の/usr/local/bin/bash場合、それでも機能しない場合は、最初のシバンラインを新しいパスに変更します

3行目を置き換えてみてください:

PORTS=(7777:GAME 11000:AUTH 12000:DB)

PORTS=('7777:GAME' '11000:AUTH' '12000:DB')

スクリプトを再実行します。

それでも機能しない場合は、次を実行してBASHバージョンをここに投稿してください

$ bash --version
于 2012-10-20T18:18:04.377 に答える
0

前後のスペースで試してください

PORTS=( 7777:GAME 11000:AUTH 12000:DB )
于 2012-10-20T18:23:30.207 に答える