シェルスクリプトの変更

シェルスクリプトの変更

私はbashスクリプトを使用してCLIで自動化されたテストを実行しています。突然動作しないようです。私たちの開発者がオペレーティングシステムをいくつか変更したようです。

私が見たエラーは

bash-3.2$ sh cli-unit.sh 
cli-unit.sh: line 53: syntax error near unexpected token `('
cli-unit.sh: line 53: ` if ! diff < (echo "$EXPECTED") < (echo "$FOUND") > /dev/null; then'

コード部分は

runTest() {
    local TITLE="$1"
    local BODY="$2"
    COUNTER=$((COUNTER + 1))

    local SHELL=$(getShell "$BODY")
    local EXPECTED=$(getOutput "$BODY")
    local FOUND=$(eval "$SHELL")

    if ! diff <(echo "$EXPECTED") <(echo "$FOUND") > /dev/null; then
        echo "--- FAIL: $TITLE"
        diff <(echo "$EXPECTED") <(echo "$FOUND")
        return 1
    fi
    PASSED=$((PASSED + 1))
    return 0
}

誰かがこの問題を変更/修正するのに役立ちますか?修正できません。よろしくお願いします。

ベストアンサー1

あなたのスクリプトは明らかにbashスクリプトですがsh

明示的にshスクリプトを起動する代わりに

  1. 使用bashする
  2. スクリプトを実行可能にし、最初の行に#!インタプリタbashを指す適切な-lineを追加してから、スクリプトを実行します./cli-unit.sh

shシェルは特定のbashシェル構文を理解することは期待できません。


あなたが示したスクリプトの内容についていくつかの追加の質問があります。

  • 誤ってシステム環境変数と競合しないように、小文字のシェル変数名を使用してください。コードは、SHELL現在のシェルのインタプリタへのパス(通常はパス)を設定します。
  • diff文字列比較には使用しないでください。不平等をテストしてくださいif [ "$variable1" != "$variable2" ]
  • printf可変データを出力する代わりに使用しますecho("なぜprintfがechoより優れているのですか?")。

解決するdiff

if [ "$FOUND" != "$EXPECTED" ]; then
    # code as before
    return 1
fi
# code as before
return 0

支店内ではif引き続きdiff使用できます。展示する違い(特に他のスクリプトやユーザーの場合予想するこのスクリプトの出力)。別のオプションは次のとおりです。

if [ "$FOUND" != "$EXPECTED" ]; then
    # $FOUND is different from $EXPECTED
    printf 'FAIL (%s): Found: %s\n' "$TITLE" "$FOUND"
    printf 'FAIL (%s): Expected: %s\n' "$TITLE" "$EXPECTED"
    # other code here
 fi
 # rest of script

またはそのようなもの。

おすすめ記事