Skocz do zawartości

Skrypt I Zmienne W Skrypcie


koralm

Rekomendowane odpowiedzi

walcze z jedna rzecza i nie moge tego zrobic ani nigdzie znalesc odpowiedzi, nawet nie wiem co szukac.

 

a problem tkwi w:

ifconfig | grep eth | awk '{print $1}'

 

i teraz chce sobie pokozystac ze zmiennych $1 $2 $3

ale jak pod tym poleceniem dam echo $1 to pojawia mi sie pusty wiersz.

 

jak uzywac zmiennych w nastepnych poleceniach tego samego skryptu??

Odnośnik do komentarza
Udostępnij na innych stronach

a problem tkwi w:

ifconfig | grep eth | awk '{print $1}'

 

i teraz chce sobie pokozystac ze zmiennych $1 $2 $3

ale jak pod tym poleceniem dam echo $1 to pojawia mi sie pusty wiersz.

 

jak uzywac zmiennych w nastepnych poleceniach tego samego skryptu??

A chcesz korzystac ze zmiennych awk czy parametrów podawanych do skryptu? Bo tak sie, jak zapewne wiesz, nieszczesliwie sklada, ze $1 dla skryptu jest parametrem a dla awk pierwszym polem aktualnie przetwarzanego rekordu :)

Podany przez Ciebie przyklad

ifconfig | grep eth | awk '{print $1}' 

wypisuje pierwsze pola z polecenia ifconfig ze wszystkich linijek zawierajacych string "eth" (domyslnie separatorem awk jest "bialy" znak - spacja lub tabulacja).

Jesli to polecenie wpisales do skryptu powloki (bash, sh, ksh) i w nastepnej linii wywolujesz

echo $1

to skrypt próbuje wypisac pierwszy z podanych parametrów skryptu :)

Zawile chyba tlumacze, ale wywolaj swój skrypt w ten sposób

 nazwa_skryptu.sh TRALALA

W efekcie powinienes zobaczyc na ekranie TRALALA.

A dlaczego nic nie widzisz na ekranie? Prawdopodobnie uruchamiasz skrypt jak zwykly user. ifconfig wypisuje wtedy "bash: ifconfig: command not found" a ten lancuch nie zawiera lancucha "eth" ;) Stad pustka na ekranie :)

 

Co zrobic zeby korzystac z wyników linijki ifconfig | grep eth | awk '{print $1}'? Przy zalozeniu, ze robisz to juz jako uprawniony uzytkownik (czyli root) wystarczy zapisac to do zmiennej skryptu

MOJA_ZMIENNA=`ifconfig | grep eth | awk '{print $1}'`
echo $MOJA_ZMIENNA

UWAGA! uzyc nalezy "odwrotnych" apostrofów. Przed ifconfig i na koncu linijki uzylem znaku, który zazwyczaj jest umieszczony na tym samym klawiszu co tylda "~", tuz nad klawiszem "TAB".

 

Pozdr,

W.

Odnośnik do komentarza
Udostępnij na innych stronach

wszystko robie jako root.

dziala tak jak napiasales ZMIENNA=.....

a teraz pytanko:

co jesli mam 3 zmienne?

 

eth0, eth1, eth2

chce manipulowac wszystkimi.

 

 

 

moze ja zle plumacze moj problem :P

chodzi o to ze z wyniku polecenia ktory otrzymam, czyli, napisy eth0, eth1 chce miec jako zmienne. czy to bedzie $1 czy $mordka5 to mi nie robi zadnej roznicy, tylko zebym mogl tym mielic do woli.

Odnośnik do komentarza
Udostępnij na innych stronach

wszystko robie jako root.

dziala tak jak napiasales ZMIENNA=.....

a teraz pytanko:

co jesli mam 3 zmienne?

eth0, eth1, eth2

chce manipulowac wszystkimi.

moze ja zle plumacze moj problem :P

chodzi o to ze z wyniku polecenia ktory otrzymam, czyli, napisy eth0, eth1 chce miec jako zmienne. czy to bedzie $1 czy $mordka5 to mi nie robi zadnej roznicy, tylko zebym mogl tym mielic do woli.

No jak masz trzy to robisz ZM1=.... grep eth0..., ZM2=....grep eth1... itd i odwołujesz się rzecz jasna przez $ZM1, $ZM2...

Wiesz co? Najlepiej to podaj ten skrypt tutaj (jak długi, to w znacznikach 'codebox' nie 'code') bo inaczej to będziemy do jutra gadać i się nie dogadamy.

Jeśli robisz jako root to powinno coś na ekran wywalić.

Jak zobaczę to się mogę chwilę pobawić.

Odnośnik do komentarza
Udostępnij na innych stronach

jak mam podac skrypt skoro go jeszcze (_niema_ → nie ma) ORT :P

ifconfig.... to pierwsza linijka i wybilo mnie z rytmu $1 $2,

 

a skrypt docelowo ma sprawdzac jakie interfejsy sa odpalone,

jak ktoregos bedzie brakowac to ma restartowac wszystkie interfejsy (service network restart). dlaczego? bo naszla mnie taka wizja, gdyz jeden z interfejsuw dziala jako klient dhcp i czasem nie chce pobrac adresu :P

 

a ze chce sie troszke pobawic to walcze:P

Odnośnik do komentarza
Udostępnij na innych stronach

a skrypt docelowo ma sprawdzac jakie interfejsy sa odpalone,

jak ktoregos bedzie brakowac to ma restartowac wszystkie interfejsy (service network restart). dlaczego? bo naszla mnie taka wizja, gdyz jeden z interfejsuw dziala jako klient dhcp i czasem nie chce pobrac adresu :P

To chyba samo "grep eth" nie pomoże, bo w ten sposób nie sprawdzisz które są UP a które DOWN, które mają adres a które nie. Rozumiem z tego co piszesz, że to tylko wprawki, ale u mnie polecenie
ifconfig | grep eth | awk '{print $1}'

daje w wyniku "eth0" (bez żadnego echo czy inne takie) więc dziwne, że u Ciebie jest w ogóle pusto. Z "palca", z linii komend próbowałeś to wpisać? Też nic?

a ze chce sie troszke pobawic to walcze:P
Hehe, rozumiem ;) Skrypty shellowe jakoś lubię i też lubię się pobawić. Powodzenia. Jakby co to pisz, jak będę umiał - pomogę.
Odnośnik do komentarza
Udostępnij na innych stronach

u mnie jest tak:

 

[root@localhost tmp]# ifconfig | grep eth | awk '{print $1}'

eth0

eth1

[root@localhost tmp]#

 

i teraz by sie przydalo to miec jako zmienne.

bo ni choroby nie moge tego zrobic.

 

podam jako przyklad cos innego.

czarowalem cos takiego:

find /home -name '.hushlogin' -exec rm -f {} \; -exec echo {} >> ~/users.hush \;

 

w/w poleceniu wynik wyszuania jest wykorzystany idelanie do tego co chcialem.

 

natomiast z "eth" nie moge tego zczarowac.

Odnośnik do komentarza
Udostępnij na innych stronach

u mnie jest tak:

[root@localhost tmp]# ifconfig | grep eth | awk '{print $1}'

eth0

eth1

[root@localhost tmp]#

Tak na szybko (produced by Badziewiakowie Co. :D) to może tak:

ZM=`ifconfig | grep eth | awk '{print $1}'`
ZM1=`echo $ZM | awk '{ print $1 }'`
ZM2=`echo $ZM | awk '{ print $2 }'`

echo "To jest interfejs $ZM1"
echo "To jest interfejs $ZM2"

Oczywiście to tylko dla 2 i-fejsów. Jeśli więcej lub zmienna liczba (to chyba bez sensu? :unsure:) to trzebaby jakąś pętelkę zawinąć.

Odnośnik do komentarza
Udostępnij na innych stronach

o cos mniej wiecej takiego mi chodzilo:

 

ZM=`ifconfig | grep eth | awk '{print $1}'`

ZM1=`echo $ZM | awk '{ print $1 }'`

ZM2=`echo $ZM | awk '{ print $2 }'`

 

if [ "$ZM1" == "eth0" ]

then echo "To jest interfejs $ZM1" >> /dev/null

else service network restart

fi

if [ "$ZM2" == "eth1" ]

then echo "To jest interfejs $ZM2" >> /dev/null

else service network restart

fi

 

 

jeszcze to musze dopracowac.

restart sieci jest powtorzony bo czasami mi nie wstaje eth0.

jeszcze to dopracuje, dajac np. pinga i jak "host nieznany to da drugi restart", a jak bedzie ping to ok. i to cos do crona :P

Odnośnik do komentarza
Udostępnij na innych stronach

restart sieci jest powtorzony bo czasami mi nie wstaje eth0.
Można chyba jeszcze badać czy interfejs dostał IP. Nie jestem pewien, bo nie mam jak sprawdzić, ale tak na mój rozum to może być pewniejsze. I zapętlasz aż się pojawi IP. Ewentualnie jakiś timeout albo określona ilośc prób w pewnych odstępach czasu (sleep 3?), żeby się w niesprzyjających warunkach nie robiło w nieskończoność.

Powodzenia ;)

W.

Odnośnik do komentarza
Udostępnij na innych stronach

chroba, nastepne schody sie zaczely:P

 

daje takie cos:

ping -c 1 wp.pl

co przy wylaczonej sieci wyrzuca mi blad: ping: unknown host wp.pl

 

i teraz chcialem to troszke podczerpac:

ping -c 1 wp.pl | awk '{print $2,$3}'

tyle ze cos nie dziala

myslalem jeszcze nad daniem

ping -c 1 wp.pl 2> ................ ale co dalej??

 

co do IP to ma ale nie dziala,

robie tak:

[root@localhost tmp]# ifconfig eth0 down

[root@localhost tmp]# ifup eth0

 

Ustalanie informacji IP dla eth0... niepowodzenie.

 

aha i tu problem:

route

[root@localhost tmp]# route

Kernel IP routing table

Destination Gateway Genmask Flags Metric Ref Use Iface

10.0.0.0 * 255.255.255.0 U 0 0 0 eth1

192.168.1.0 * 255.255.255.0 U 0 0 0 eth0

169.254.0.0 * 255.255.0.0 U 0 0 0 eth1 <--- nie bardzo wiem co to za ufo?

 

i brakuje jednej linijki:

 

default router_neo 0.0.0.0 UG 0 0 0 eth0

 

 

router_neo = 192.168.1.1

 

ktora sie pojawia dopiero po restarcie sieci:P

moze oleje pinga i dobiore sie od tej strony:P

sprawdze czy jest ten problem jak nie wstaanie eth0 po restarcie

 

 

wersja alpha:

 

--cut--

#!/bin/bash

ZM=`ifconfig | grep eth | awk '{print $1}'`

ZM1=`echo $ZM | awk '{ print $1 }'`

ZM2=`echo $ZM | awk '{ print $2 }'`

 

if [ "$ZM1" == "eth0" ]

then echo "$ZM1 ok"

else service network restart

fi

 

ruting=`route | awk '{print $2}' | sed -e '1,5d'`

if [ "$ruting" == "192.168.1.1" ]

then echo "net ok"

else service network restart

fi

--cut--

Odnośnik do komentarza
Udostępnij na innych stronach

Nastepny problem ze zmienna.

 

np. do zmiennej USERS mam przyporzadkowana liczbe userow, jednym razem jest ich 5 innym razem 50.

 

echo $USERS nie rozwiazuje mi problemu :P

 

jak to rmozmontowac za pomoca petli for? ewentulanie innej petli jesli sie w ogóle da to zrobic??

zastanawialem sie nad dodaniem polecenia seq tyle ze neimam wizji urzeczywistnienia mojego pomyslu.

Odnośnik do komentarza
Udostępnij na innych stronach

echo $USERS nie rozwiazuje mi problemu :P
Dlaczego? Czy to wynika z tego co piszesz o "rozmontowaniu?
jak to rmozmontowac za pomoca petli for? ewentulanie innej petli jesli sie w ogóle da to zrobic??
Może:
echo $USERS | awk ' { for (i = 1; i <= NF; i++) { print $i } } '

to oczywiście tylko wypisuje "rozmontowane" ;) nazwy po jednej w wierszu, ale mozna każdy z tych wierszy przechwycic i poddać dalszej obróbce. Nie wiem czy to o to Ci chodziło? No i to nie jest "czysty" skrypt shellowy, ale nie ma raczej uniksa bez awk.

[Edit]Na wszelki wypadek słowo wyjaśnienia: NF to wbudowana zmienna awk przechowująca ilość pól w aktualnie przetwarzanym rekordzie.

Odnośnik do komentarza
Udostępnij na innych stronach

za chwile poprubuje twojego rozwiazania.

 

a miedzy czasie zboczylem troszke na tablice.

i wyczarowalem takie cos:

 

# Wczytanie tablicy userow zalogowanych na FTP
for fus in `ftpwho | sed -e '1d' | awk '{print $1,$2,$4,$5}' | sed -n -e 's/]//p' | awk '{print $2}'`; do
x=`expr $x + 1`
FTP_U[$x]=$fus[$x]
done
# Wyswietlenie tablicy userow zalogowanych na FTP
for z in `seq $x`; do
echo ${FTP_U[$z]}
z=`expr $z + 1`
done

 

i teraz pytanie jak zaadresowac tablice dwuwymiarowa?

chce otrzymac cos na zasadzie [1,1] nastepna pozycja [2,1] itp.

bo majac 4 zmienne wrzuce sobie to do tablicy i bedzie fajniej :P

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
×
×
  • Dodaj nową pozycję...