Jak zrobić w bashu skrypt przeczący?


(Saver) #1

Witam, zacząłem zabawę z Bashem, i zrobiłem prosty bot GG w EKG który odpowiada na komendy. Wszystko ładnie działa, ale chce zrobić aby ten skrypt ignorował jeden numer GG,

myślałem już nad tym:

case $1 in

IGNOROWANY_NUMER)

if ["$2" = "uptime"]; then

echo "Uptime :> "

eval 'w'

fi

;;

*)

W tym małym skrypcie pokazałem że komenda "uptime" jest pokazywana tylko dla Ignorowanego numeru, a jak zrobić aby każdy inny numer mógł używać tej komendy a ignorowany numer nie? Pozdrawiam. PYTANIE 2 A i żeby nie zakładać nowego wątku to mam drugie pytanie związane z tym pytaniem. Jak zrobić więcej warunków w jednej linii?

elif ["$2" = "data"]; then

echo "Data systemowa: "

eval "date"

I teraz chce aby w jednym warunku było więcej znaczeń. przykład:

elif ["$2" = "data", "Data", "DatA", "DATA", dAtA""]; then #w tej lini, tylko ten sposób nie działa

echo "Data systemowa: "

eval "date"

Abym nie musiał ciągle nowego ELIFa tworzyć i tak by było o wiele ładniej, ale nie działa.


(nintyfan) #2

Należy pamiętać, że '[' jest nazwą programu. Zarówno jest to polecenie wewnętrzne(wbudowane), jak i oddzielna binarka. if sprawdza czy $? (kod powrotu zwrócony przez zadanie, które ostatnio zakończyło się na pierwszym planie) jest równy 0.

W takim przypadku proszę pamiętać, że możemy stosować &&, jak również || .

Czyli:

if ["a" == "a"] && ["b" == "b"]; then echo a; fi

-- Dodane 16.12.2010 (Cz) 16:40 --

function has_only() { b=$1; shift; for a in $*; do echo $a == $b; if [$a != $b]; then return 1; fi; done; return 0; }

Sposób użycia:

if has_only $powtarzany $data0 $data1 $data2; then zrob_cos; fi

(Saver) #3

Dzięki, niestety nie działa && ale za to działa || więc jest dobrze :slight_smile: Mam teraz drugie malutkie pytanko da się zrobić aby, jak ktoś wpisał "Test wyraz" a mam zapisane tylko "test" to żeby też wyświetlało mu w tym przypadku słowo "ok"

if ["$2" = "test"]; then

echo "ok"

już nawet próbowałem dopisać * w ["$2" = "test*"]; then ale trzeba było napisać test* aby pokazało tekst.


(dragonn) #4

Można zrobić tak:

cos=$(echo $2 | grep test | wc -l)

if ["$cos" = "1"]; then

echo "ok"

fi

(Saver) #5

Niestety, Nie działa, nie zwraca także żadnego błędu

Nawet po wpisaniu samego "testownia" nic nie pokazuje


(dragonn) #6

Bo nie ma być $cos = "testowania" tylko = 1. Jeżeli chcesz coś zmienić to zmieniasz wartość po grep. W takiej formie jak ja podałem działa.


(Saver) #7

Nie rozumiem, czyli ma być

cos=$(echo $2 | grep test | wc -l)

if [1 = "testownia"]; then

echo "ok"

fi

(dragonn) #8

Nie ma być.

cos=$(echo $2 | grep test | wc -l)

    if ["$cos" = "1"]; then

    echo "ok"

    fi

Widzę że muszę ci trochę objaśnić, a więc pierwsza linia przypisuje wynik echo $2 | grep test | wc -l do zmiennej cos, a echo $2 służy do przekazania wartość zmiennej 2 do programu grep który służy do sprawdzania czy w linii której dostał jest słowo test, jeżeli jest to całą linię przekazuje tą linię do programu wc, który ma zliczyć linie, czyli wynik całego tego polecenia będzie 1 jeżeli w zmiennej 2 jest słowo test, a jeżeli nie ma to da nam wynik 0, taka sobie logika binarna :smiley: .


(Saver) #9

O dzięki działa :smiley:

A czy można dodać więcej słów po grep?

cos=$(echo $2 | grep test,test2,test3 | wc -l) ?

Albo jak zrobić zmienną, bo to nie działa.

badworts=$(echo "mama" | "tata" | "babcia" | "dziadek")

cos=$(echo $2 | grep $badworts | wc -l)

if ["$cos" = "1"]; then

echo "ok"


(dragonn) #10

Wszystko można, ja bym to tak zrobił:

BADWORTS=("wpisujesz" "słowa" "które" "chcesz")

	for slowo in "${BADWORTS[@]}"; do

		    cos=$(echo $2 | grep $slowo | wc -l)

                            if ["$cos" = "1"]; then

                                       echo "ok"

                            fi

	done

Dokładnie ci nie powiem jak ta pętla działa, przynajmniej do tego co jest wewnątrz niej po kolej przypisuje do zmiennej slowo po kolei wszystko z zmiennej BADWORTS, skopiowałem ją z skryptów startowych arch.


(Saver) #11

A czy można zapisać wszystkie badworts do pliku i z pliku bedzie szukane? Bo jest dość dużo słów.


(dragonn) #12

Można, ale to zależy jaką formę ma ten plik, najprostsze rozwiązanie to stworzenie pliku o tej formie:

#!/bin/bash

BADWORTS=(

slowo1

slowo2

slowo3

slowo4

slowon

)

A na samym początku skryptu dać linię:

. /scieżka/do/pliku

(Saver) #13

Nie działa to:

BADWORTS=("test" "tost" "testa" "testa")

   for slowo in "${BADWORTS[@]}"; do

          cos=$(echo $2 | grep $slowo | wc -l)

                            if ["$cos" = "1"]; then

                                       echo "ok"

                            fi

   done

(dragonn) #14

U mnie działa, jak uruchamiasz skrypt? W sensie jak podajesz mu zmienne.


(Saver) #15

To jest script dla EKG, mam go w pliku *.sh

-- Dodane 17.12.2010 (Pt) 19:46 --

Przepraszam, już działa script :slight_smile:

Dziękuje za pomoc :slight_smile:

-- Dodane 17.12.2010 (Pt) 19:49 --

Eee, dobrze zrobiłem?

[b]BADWORTS=("./sciezka/do/plik")[/b]

   for slowo in "${BADWORTS[@]}"; do

          cos=$(echo $2 | grep $slowo | wc -l)

                            if ["$cos" = "1"]; then

                                       echo "ok"

                            fi

   done

(dragonn) #16

Dobrze by było wiedzieć jak ekg podaje zmienne, bo jeżeli on uruchamia skrypt np. tak:

./skrypt zmienna1 slowo slowo2 slowo3

To slowo2 i 3 będą przepisywane następnym zmiennym, czyli nie zmiennej $2 , ale kolejno $3 i $4, rozwiązaniem jest:

./skrypt zmienna1 "slowo slowo2 slowo3"

Albo użycie zamiast $2 $@ EDIT A sam skrypt powinie wyglądać tak:

. /sciezka/do/plik

   for slowo in "${BADWORTS[@]}"; do

          cos=$(echo $2 | grep $slowo | wc -l)

                            if ["$cos" = "1"]; then

                                       echo "ok"

                            fi

   done

Nie zjedz spacji miedzy .[sPACJA]/


(Saver) #17

Działa, dziękuje za pomoc :slight_smile: