Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
#!/bin/bash clear; echo podaj j; read j clear; if [ $j -eq 0 ]; then `while true; do clear; echo; echo " PRZEBIEG $i "; echo; date; echo; acpi -b; echo; lscpu | grep "CPU M"; echo; sensors; sleep 1 done` else `for ((i=1; i<=j; i++)); do clear; echo; echo " PRZEBIEG $i z $j "; echo; date; echo; acpi -b; echo; lscpu | grep "CPU M"; echo; sensors; sleep 1; done` fi
Zdaje się, że prosta rzecz. Podaję j np 5 i:
./sns.sh: linia 12: $'\E[3;J\E[H\E[2J': nie znaleziono polecenia
Co zrobiłem źle?
Dopisek:
Póki co, to zrobiłem obejście, bo tam gdzie mam pętle for i whie to wrzuciłem je do oddzielnych plików odpowiednio nazwanych i ładuję je sobie poprzez source i działa. Ale pytanie pozostaje aktualne :D
Ostatnio edytowany przez Pavlo950 (2016-05-29 23:23:54)
Offline
Po co zamykasz te pętle w backquotach?
Offline
3036
Ostatnio edytowany przez uzytkownikubunt (2016-12-01 01:41:20)
Offline
uzytkownikubunt napisał(-a):
Jeśli robisz plik ze skryptem to rozpisz to na więcej, krótszych linii z wcięciami i bez tych `
Szczerze? Nigdy bym nie pomyślał, że przez tak głupią błahostkę skrypt może nie działać.... Dzięki.
Offline
to teraz zamiast bezmyślnie wstawiać różne fajne znaczki do skryptu coby ślicznie wyglądał zapoznaj się z Wielką Xięgą Proroka Manuala o bashu traktującą, ze szczególnym uwzględnieniem działu o operatorach wszelakich z backtickiem na czele.
jak wypełniasz pita i wstawisz przecinek w kwocie (bo ładniej) to też będzie drobna błahostka? skarbówce to powiesz?
Offline
Koncowo:
#!/bin/bash clear; echo ile przebiegow?; read ileprzebiegow; clear; if [ $ileprzebiegow -eq 0 ]; then for ((i=1; i=i; i++)); do clear; echo -e "\n PRZEBIEG $i \n\n `date` \n\n `acpi -b` \n\n `lscpu | grep 'CPU M'` \n\n `sensors` \n\n `sudo hddtemp /dev/sda`"; sleep 1; done else for ((i=1; i<=ileprzebiegow; i++)); do clear; echo -e "\n PRZEBIEG $i z $ileprzebiegow\n\n `date` \n\n `acpi -b` \n\n `lscpu | grep 'CPU M'` \n\n `sensors` \n\n `sudo hddtemp /dev/sda`"; sleep 1; $ fi
ethanak napisał(-a):
to teraz zamiast bezmyślnie wstawiać różne fajne znaczki do skryptu coby ślicznie wyglądał zapoznaj się z Wielką Xięgą Proroka Manuala o bashu traktującą, ze szczególnym uwzględnieniem działu o operatorach wszelakich z backtickiem na czele.
jak wypełniasz pita i wstawisz przecinek w kwocie (bo ładniej) to też będzie drobna błahostka? skarbówce to powiesz?
OK. A pita nie ja wypełnia, tylko daję to komuś innemu :D
Ostatnio edytowany przez Pavlo950 (2016-05-30 19:46:12)
Offline
Dalej jakiś bezsens.
Brak łamania lini.
Nie zamknięta druga pętla.
Ostatnio edytowany przez arecki (2016-05-30 21:26:22)
Offline
3038
Ostatnio edytowany przez uzytkownikubunt (2016-12-01 01:41:23)
Offline
A mi się powielenie kodu w ogóle nie podoba. Takoż sprzątanie pod dywan błędnie wprowadzanych danych poprzez typeset/declare.
Teoretycznie można by tak:
#!/bin/bash if [ -n "$1" ] ; then ile=$1 else echo -n "Ile przebiegów? " read ile fi re='^(0|[1-9][0-9]*)$' [[ $ile =~ $re ]] || { echo "To nie jest liczba" exit 1 } function przebieg { echo "Przebieg $1" #tu wszystkie acpi, sensorsy i inne echo "Coś robię" if [ $ile -eq 0 ] || [ $1 -lt $ile ] ; then sleep 1 fi } clear if [ $ile -eq 0 ]; then for ((li=1 ; ; li++)) ; do przebieg $li done else for ((li = 1 ; li <= ile ; li++)) ; do przebieg $li done fi
ale na dobrą sprawę dwie pętle też są brzydkie, a więc zrobimy z niej jedną:
for ((li=1 ; ile == 0 || li <= ile; li++)) ; do przebieg $li done
Jeszcze drobna uwaga.
Nie dopuszczam tu zapisu liczbowego rozpoczynającego się od zera - bash traktuje to jako zapis ósemkowy.
Oczywiście można inaczej - uprościć regexpa:
re='^[0-9]+$'
i po sprawdzeniu czy jest to liczba wymusić konwersję dziesiętną:
ile=((10#$ile))
Może być? :)
Offline
ethanak napisał(-a):
Może być? :)
Czemu nie - będę bawił się dalej :D
arecki napisał(-a):
Dalej jakiś bezsens.
Brak łamania lini.
Nie zamknięta druga pętla.
W tej jednej pętli tak ma być. O ile jedna musi być zamknięta, bo musi się skończyć np po 5 minutach, o tyle drugą sobie kiedyś wykorzystam, jak wrzucę do autostartu - a skąd ja będę wiedział, ile czasu będzie chodził włączony komp? XD
Offline
Pavlo950 napisał(-a):
W tej jednej pętli tak ma być. O ile jedna musi być zamknięta, bo musi się skończyć np po 5 minutach, o tyle drugą sobie kiedyś wykorzystam, jak wrzucę do autostartu - a skąd ja będę wiedział, ile czasu będzie chodził włączony komp? XD
Pierwsza pętla jest nieskończona.
Pavlo950 napisał(-a):
Kod:
if [ $ileprzebiegow -eq 0 ]; then for ((i=1; i=i; i++)); do ....; done
Reszty nie skomentuję bo argumenty z czapy.
Offline
ethanak napisał(-a):
przecież z założenia ma być nieskończona!
W jego założeniach ta zamknięta pętla ma się skończyć po 5 minutach, a w rzeczywistości jest nieskończona !
Pavlo950 napisał(-a):
... O ile jedna musi być zamknięta, bo musi się skończyć np po 5 minutach
Widzisz teraz bezsens ? :D
Offline
dalej nie wiem gdzie widzisz problem. jedna pętla się kończy po iluś tam przebiegach, druga nie. co ci przeszkadza? to że pavlo programistym nie jest i (jak sam twierdzi) nigdy nie będzie? czy może brak estetyki w skrypcie?
ciekawe do czego się doczepisz w mojej wersji...
Offline
Ja tu nie widzę w wątku aby autor twierdził, że nie jest programistą.
Widzę, za to herezje w stylu zamykania pętli w backquotach i późniejsze określanie tego błahostką.
Jakby na początku wątku określił, że się nie zna to nie byłoby tematu.
Offline
arecki napisał(-a):
Ja tu nie widzę w wątku aby autor twierdził, że nie jest programistą.
Widzę, za to herezje w stylu zamykania pętli w backquotach i późniejsze określanie tego błahostką.
Jakby na początku wątku określił, że się nie zna to nie byłoby tematu.
Powtórzę, nie jestem programistą i nie planuję być.
Offline
Wątek sobie chyba przemianuję na "moje problemy z bashem" XD
for i in `find | grep -e jpg`; do mv "$i" "`date +%y%m%d%H%M%S%N`.jpg"; done
Jak poradzić sobie z plikami ze spacją w nazwie?
Wiem, że można to zrobić inaczej, ale chodziło mi o powiedzmy jako taką numerację.
Dopisek:
Dobra, mam.
https://forum.dug.net.pl/viewtopic.php?id=10583
find | grep -e jpg -e jpeg | while read i; do mv "$i" "`date +%y%m%d%H%M%S%N`.jpg"; done
Ostatnio edytowany przez Pavlo950 (2016-06-01 13:13:36)
Offline
można inaczej - przeczytać wreszcie mana od finda i użyć -exec.
ale po co czytać, lepiej pozawracać dupę na forum;)
Offline