私は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
スクリプトを起動する代わりに
- 使用
bash
する - スクリプトを実行可能にし、最初の行に
#!
インタプリタ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
またはそのようなもの。