Pomoc przy napisaniu "sprawdzarki" w bash

0

Próbuje napisać sprawdzarkę w Bash, ma ona działać tak:

Odpalam program tworzący test
odpalam program który powinien dać dobre rozwiązanie
odpalam program który sprawdza czy odpowiedź spełnia warunki

No ale mam problem

#!/bin/bash

odp="DOBRZE\n"
poprawna="DOBRZE\n"
ilosc_testow=0

while [["$odp" -eq "$poprawna"]] ; do
	python test_maker.py
	
	./alg < test.in > my.out
	./sprawdz < my.out > odp.out
	
	odp=cat odp.out
	
	ilosc_testow=$[ilosc_testow + 1]
	echo $ilosc_testow
done

for i in {1..5}
do
	play -n synth 0.1 sine 880 vol 0.5 > /dev/null 2>&1
done

ale po próbie uruchomienia dostaje komunikat:
./operat.bash: line 7: [[DOBRZE\n: command not found
(linia 7 to ta z while)

nie wiem też jak przypisać zawartość pliku do jakieś zmiennej żeby sprawdzać czy moja sprawdzarka dała odpowiedź "DOBRZE\n", proszę o pomoc :)

EDIT:
Napisałem coś takiego i działa

#!/bin/bash

difference=""
ilosc_testow=0

while ["$difference" == ""] ; do
	python test_maker.py
	
	./alg < test.in > my.out
	./sprawdz < my.out > ans.out
	
	difference=$(diff --strip-trailing-cr "ans.out" "dobrze.txt")
	
	ilosc_testow=$[ilosc_testow + 1]
	echo $ilosc_testow
done

for i in {1..5}
do
	play -n synth 0.1 sine 880 vol 0.5 > /dev/null 2>&1
done

tylko musiałem dodać plik dobrze.txt, ktoś mógłby mi pomóc zrobić to bez tego dodatkowego pliku?

2

Spacje wokół operatorów w sh są bardzo istotne. Zapewne chciałeś napisać:

[[ "$odp" -eq "$poprawna" ]]

Poza tym

odp=cat odp.out

zadziała trochę inaczej niż oczekujesz (powinno być odp=$(cat odp.out)). Mam wrażenie, że:

ilosc_testow=$[ilosc_testow + 1]

Też nie jest poprawnym zapisem (powinno być $(())).


Po edycji, masz w Bashu wsparcie dla zastępowania poleceń, które użyje tymczasowych potoków:

<(cmd)

A zapis:

foo > tmp
bar < tmp

Może zostać zastąpiony przez

foo | bar

W części przypadków (np. tym tutaj).

0

Napisałem coś takiego:

#!/bin/bash

odp="DOBRZE\n"
poprawna="DOBRZE\n"
ilosc_testow=0

while [[ "$odp" == "$poprawna" ]] ; do
	python test_maker.py
	
	<(cmd)
    ./alg < test.in | ./sprawdz > odp.out
	
	odp=$(cat odp.out)
	
	ilosc_testow=$[ilosc_testow + 1]
	echo $ilosc_testow
done

for i in {1..5}
do
	play -n synth 0.1 sine 880 vol 0.5 > /dev/null 2>&1
done

dostaje takie błędy

./operat.bash: line 10: /dev/fd/63: Permission denied
./operat.bash: line 10: cmd: command not found

coś ciebie źle zrozumiałem :/

0

W sumie czemu w Bashu a nie jakims Pythonie? Przynajmniej problemy syntaktyczne czy cos by zniknely bo to jednak nie jest najfajniejszy jezyk :) EDIT: to akurat moze nie jest najwazniejsze, ale wazniejsze ze nie znasz dobrze Basha tak czy siak

2

@Suchy702: składnia <(cmd) (tzw. process substitution) zawiera najprawdopodobniej, według intencji @hauleth , tylko placeholder dla polecenia. To znaczy, zamiast ciągu cmd powinieneś napisać w tym nawiasie polecenie, które chcesz wykonać. Tutaj masz opisaną całą tę składnię: https://www.gnu.org/software/bash/manual/bash.html#Process-Substitution Nie jestem pewien, czemu @hauleth o tym wspomniał, bo nie widzę dla tego zastosowania w Twoim kodzie, skoro już używasz |.


PS Nadal masz błąd w linii:

ilosc_testow=$[ilosc_testow + 1]

Powinno być (jak wspomniał @hauleth ):

ilosc_testow=$((ilosc_testow + 1))

Jest to tzw. arithmetic expansion. Tutaj masz opisane: https://www.gnu.org/software/bash/manual/bash.html#Arithmetic-Expansion

1 użytkowników online, w tym zalogowanych: 0, gości: 1