bash skrypt

Problemy dotyczące programowania.

Moderatorzy: Moderatorzy, Administratorzy

sayetan
Moderator w st. spocz.
Posty: 2193
Rejestracja: 2004-06-20, 21:47
Lokalizacja: Jelenia Góra

bash skrypt

Post autor: sayetan »

Ot wiem ze niektorzy z Was znaj sie na bashu wiec i Was troche pomecze :P
mam pare pytan zwiazanych z bashem a z ABS nie znalazlem jeszcze odpowiednich przykladow

1. Umiem zrobic aby skrypt pytal mnie (y/n) i w zaleznosci od danej odpowiedzi robil to co jest dalej zdefiniowane
ale nie wiem zabardzo jak zrobic zeby skrypt przy podawaniu sciezki odrzucal jej niepoprawny wpis czyli:
przepuszczal taka skladnie /jakas/lokalizacja/ a odrzucal taka /jakas/lokalizacja
czyli ogolnie chodzi mi zeby sprawdzal czy jest / na koncu linii:

Kod: Zaznacz cały

Podaj sciezke docelowa: /jakas/sciezka
Zla sciezka!!
Podaj sciezke docelowa: /jakas/sciezka/
podanie dokladnej sciezki jest istotnym szczegolem poniewaz w przypadku podania /jakas/lokalizacja
bash potraktuje drugi wpis(czyli lokalizacja) jako nazwe pliku, a nie taki ma byc zamiar tego skryptu
w sumie to chyba prostszym?! zadaniem by bylo automatycznie dopisac na koncu / w przypadku jego braku, czy sie myle?
i przy okazji sprawdzal jej poprawnosc tzn. nie dopuszczal podania nieistniejacej lokalizacji

2. Chcialbym zrobic aby skrypt interpretowal parametry w sposob w jaki robia to programy czyli:

Kod: Zaznacz cały

./skrypt --dest=/jakas/lokalizacja/
ustala mi wartosc DESTw skrypcie do ktorej potem odnosi sie wiele programow, np.(linijka ze skryptu):

Kod: Zaznacz cały

cp $TMP/nazwa_pliku $DEST
wiem ze moge to zrobic przez dodanie $1, $2 do skryptu, ale nie zabardzo kumam to:

Kod: Zaznacz cały

DEST=
HOME=
TMP=

if [ $# -eq 0 ] ; then
    echo "Podaj argumenty"
else
    $DEST=$1
    $HOME=$2
    $TMP=$3
fi
ale moim zdaniem jezeli ktos nie wpisze ktoregos z parametru to bede musial robic:

Kod: Zaznacz cały

if [ $1 (yy no wlasnie i co tu dac? -eq dla liczb = i != dla ciagu znakow) 0? ]
no wlasnie i tu znowu postoj, bo nie wiem co mam wstawic zeby sciezki i przy tym sprawdza lczy takie istnieja na dysku( np. /mnt/costam/)
mi raczej chodzi o podawanie parametrow z okresleniem ich tzn.:

Kod: Zaznacz cały

./skrypt --dest= --home= --tmp=
zeby przy wpisywaniu ktos wiedzial jaka wartosc dla jakiego parametru wstawia(nie wiem czy takie cos sie da w bashu zrobic)
oczywiscie jezeli sie da to wiem ze prosciej moge jak opisalem wyzej czyli okreslic dla katalogu jakie moze przyjmowac wartosci
i nastepnie w wyniku podania choc jednej niepoprawnej wyswietlal cala poprawna skladnie skryptu z parametrami np.:

Kod: Zaznacz cały

./skrypt $TMP $HOME $DEST
czyli prosciej mowiac przypominal uzytkownikowi w jakich kolejnosciach ma jakie paramtery podawac

3. Skrypt najpierw wykonuje polecenia dla usera jezeli on zgodzi sie w pytaniu: "czy chcesz wykonac polecenie bleble (y/n): "
nastepnie niezaleznie od tego czy wykona te poelcenia user, czy nie wykona, przechodzi w wykonywanie polecen przez roota
root tutaj ma kluczowego znaczenie poniewaz niektore polecenia nie moga byc wykonywane przez zwyklych userow
a wiec tak to uczynilem(nie dziala zreszta):

Kod: Zaznacz cały

if [ `id -un` = root ] ; then
    echo "Wykonuje polecenia roota"
      /polecenie/roota
  else
    echo "NIe masz uprawnien roota, ktore sa potrzebne, czy przelogowac? (y/n): "
  read pytanie
      if [ $pytanie = n ] ; then
    echo "Nie zgodziles sie na przelogowanie, Wychodze!"
  exit       # moge tutaj uzyc polecenia exit? przy break wywalilo "break: only meaningful in a `for', `while', or `until' loop" czyli cos zle
      fi
      if [ $pytanie != y ] ; then
    echo 'Prosze podac "y" albo "n"'
      fi
      if [ $pytanie = y ] ; then
    su
      fi 
fi
no ale niestety dzieje sie tak ze gdy wyswietli sie prompt o haslo i wpisze haslo to wywala mnie to basha i dostaje prompt roota
gdy wpisze exit(czyli wychodze z konta roota na konto na ktorym wykonywalme skrypt) to wszystko po su zostaje wykonane
czyli tak jakby nbash ustala sobie ze wszystkie komendy ida na usera a su jest wykonywane i nic nie robi na koncie roota
da sie to jakos sensownie zlepic aby po zalogowaniu na konto roota wykonywale dalsze polecenia ?
wiec juz wiadomo ze chodzi mi o to aby w jakis sposob podzielic skrypt na dwie czesci:
pierwsza dla usera, druga dla roota i gdzies pomiedzy nimi sprawdzanie ID po nazwie
(zalozylem ze skrypt bedzie mogl uruchamic zwykly user lub root)

4. Czy istnieje mozliwosc wyciecia znakow oddzielonych znakiem ","(przecinek), co na takie zasadzie jak w przypadku useradd
kiedy to podajemy grupy do ktorych ma nalezec user, oddzielajac je przecinkeim czyli ciagn znakow:
/plik,plik2,plik3,plik4 sa podstawiane pod kolejno $D1 $D2 $D3 $D4 aha ciagn znakow plik,plik2...
wpisujemy po otrzymaniu echo "Wpisz poprawne nazwy plikow": wpisujemy plik,plik2... [enter] a on nam ladnie
to podstawia pod $D1 $D2 itp..

no... to tyle z mojego meczenia, i tyle zdazylem nauczyc sie przez noc( tyle studiowalem ABS, ksiazke pt. Po Prostu RedHat 7.2" Wydawnicto Helion, wypociny Dozziego :P i man roznych polecen)
jakby ktos byl w stanie udzielic mi odpowiedzi na powyzsze jakze dreczace mnnie pytania :)


Dziekuje

PS. szkoda ze

Kod: Zaznacz cały

 nie formatuje tak jak np. mcedit, wtedy wszystko byloby klarownie widac w skrypcie :)
DanielLinux
Użytkownik
Posty: 552
Rejestracja: 2004-06-11, 17:24

Re: bash skrypt

Post autor: DanielLinux »

1. Umiem zrobic aby skrypt pytal mnie (y/n) i w zaleznosci od danej odpowiedzi robil to co jest dalej zdefiniowane
ale nie wiem zabardzo jak zrobic zeby skrypt przy podawaniu sciezki odrzucal jej niepoprawny wpis czyli:
przepuszczal taka skladnie /jakas/lokalizacja/ a odrzucal taka /jakas/lokalizacja
czyli ogolnie chodzi mi zeby sprawdzal czy jest / na koncu linii:

Kod:
Podaj sciezke docelowa: /jakas/sciezka
Zla sciezka!!
Podaj sciezke docelowa: /jakas/sciezka/

podanie dokladnej sciezki jest istotnym szczegolem poniewaz w przypadku podania /jakas/lokalizacja
bash potraktuje drugi wpis(czyli lokalizacja) jako nazwe pliku, a nie taki ma byc zamiar tego skryptu
w sumie to chyba prostszym?! zadaniem by bylo automatycznie dopisac na koncu / w przypadku jego braku, czy sie myle?
i przy okazji sprawdzal jej poprawnosc tzn. nie dopuszczal podania nieistniejacej lokalizacji
Jeżeli chodzi o to żeby sprawdził ścięzkę to wystarczy coś takiego:

Kod: Zaznacz cały

#!/bin/bash
sciezka='/sciezka'

if [ $1 != $sciezka ];
then 
echo "Zla sciezka"
else 
echo "OK"
fi
podajesz sh skrypt.sh /sciezka i działa.
Ale jeżeli chcesz bardziej rozbudować np. żeby porównał Ci czy dany wpis jest katalogiem to w warunku if dajesz
if [ -d $sciezka ] wtedy sprawdza Ci czy sciężka jest katalogiem
if [ -f $sciezka ] wtedy sprawdza Ci czy sciezka jest plikiem

[ Dodano: 2004-07-31, 09:44 ]
i jeszcze dodam, że np. jeśli sciazka jest katalogiem
znak='/'
if [ -d $sciezka ];
then
echo $sciezka$znak

to jeżeli wpiszesz np. /sciezka/jakas i jakas bedzię katalogiem to utworzy Ci
/sciezka/jakas
Awatar użytkownika
Sad Mephisto
Administrator
Posty: 2824
Rejestracja: 2004-05-22, 13:24
Lokalizacja: Zabrze
Kontakt:

Re: bash skrypt

Post autor: Sad Mephisto »

Grep, grep, grep i jeszcze raz grep :)
W pierwszym przypadku:

Kod: Zaznacz cały

# Załóżmy, że PATH_OLD="/home/foo/bar"
PATH_NEW="$PATH_OLD/"
if [[ `echo $PATH_NEW | grep "//"  == "" ]]; then
   PATH_OK=$PATH_NEW
else
   PATH_OK=$PATH_OLD
fi;
Powyższy skrypt dokleja slasha na końcu i sprawdza, czy nowy łańcuch zawiera dwa slashe, czyli np: /home/foo/bar//. Jeśli tak jest, przyjmuje starą wersję. Jeśli nie (czytaj: nie było slasha na końcu, więc tylko 1 został doklejony - czyli nie ma "//") to przyjmuje nową wersję. Gdy nie chcesz mieć slasha na końcu, to po prostu zmieniasz warunek z "==" na "!=". Skrypt piszę z głowy bez testowania (może nie działać), ale podrzuciłem ci w każdym razie pomysł.

W drugim przypadku sprawa jest bardziej złożona, ale też za wykonalna za pomocą grepa :)
Plan jest taki:
1. Sprawdzasz każdy parametr $1, $2 itd.
2. Sprawdzasz grepem w poszukiwaniu "--konkretnej_opcji=", a następnie wydajesz polecenie "man sed" w poszukiwaniu informacji o podmianie stringów (chodzi o to by usunąć ten cały --przedrostek)

A co do trzeciego: AFAIK było "sudo -c"
[i]Thank you for noticing this notice. Now that you've noticed this notice, you may have noticed that this notice is noticably unnoticable.
$ python -c "print int(''.join(map(lambda x: str(len(x)),'Kto z woli i myśli zapragnie Pi spisać cyfry ten zdoła.'.split())))/1e+10"[/i]
DanielLinux
Użytkownik
Posty: 552
Rejestracja: 2004-06-11, 17:24

Re: bash skrypt

Post autor: DanielLinux »

powinno byc /sciezka/jakas/ :)
sayetan
Moderator w st. spocz.
Posty: 2193
Rejestracja: 2004-06-20, 21:47
Lokalizacja: Jelenia Góra

Re: bash skrypt

Post autor: sayetan »

jeszcze jedno bo sie juz pogubilem:
jezeli nir zrobie tego o czym bede pisal teraz to ocje ktore podaliscie nie maja sensu, a wiec:

Kod: Zaznacz cały

echo -n "Okresl lokalizacje docelowa: "
  read lokal
  DEST=$lokal
  echo "Lokalizacja docelowa to: $DEST"
    if [ -d $DEST ] ; then
  echo "Sciezka poprawna!"
    /jakies/polecenie
    else
  echo "Sciezka niepoprawna!"
    (.......)    
    fi
co wpisac w miejsce kropek aby po wpisaniu zlej sciezki, wracal do pytania "Okresl lokalizacje docelowa:"
z tego co wiem break, continue dziala tylko przy petlach a to nie jest petla

co do reszty, spoko mam jeszcze caly dzien :) cos wykombinuje.
Awatar użytkownika
Sad Mephisto
Administrator
Posty: 2824
Rejestracja: 2004-05-22, 13:24
Lokalizacja: Zabrze
Kontakt:

Re: bash skrypt

Post autor: Sad Mephisto »

No to załóż sobie pętlę. Daj na początek zmienną, która będzie przyjmować np. "false". Jeśli warunek jest prawdziwy, to niech zmieni na "true". W pętli pozostaje tak długo, aż ta zmienna ma wartośc "false" oczywiście.

Możesz też zrobić pętlę nieskończoną, np. słynne "while 1" i wtedy wyłamujesz się z niej jednym z poleceń, które przytaczasz.
[i]Thank you for noticing this notice. Now that you've noticed this notice, you may have noticed that this notice is noticably unnoticable.
$ python -c "print int(''.join(map(lambda x: str(len(x)),'Kto z woli i myśli zapragnie Pi spisać cyfry ten zdoła.'.split())))/1e+10"[/i]
sayetan
Moderator w st. spocz.
Posty: 2193
Rejestracja: 2004-06-20, 21:47
Lokalizacja: Jelenia Góra

Re: bash skrypt

Post autor: sayetan »

eh nie kumam tego totalnie, z tego co widzialem to wszystkie przyklady operuja na jednym warunku
i jezeli warunek zostanie spelniony on wykonuje jakas komende, jezeli nie to wychodzi
wiec jak teraz zrobic zeby przy niezpelnionym warunku dodac jeszcze dwa inne warunki?
czarnia magia a przykladziki tego nie opsiuja, byc moze jestem na to za glupi
moze jakis maly przykladzik jak to rozplatac ?! :P
Awatar użytkownika
Sad Mephisto
Administrator
Posty: 2824
Rejestracja: 2004-05-22, 13:24
Lokalizacja: Zabrze
Kontakt:

Re: bash skrypt

Post autor: Sad Mephisto »

Kod: Zaznacz cały

zostan_w_petli=true
while [[ $zostan_w_petli == true ]]; do
    <tutaj jakiś kod do wykonania>
    if [ <jakiś warunek> ]; then
        <wykonaj jakieś polecenie>
        zostan_w_petli=false
    fi;
done;
Tylko jeśli warunek określony w instrukcji "if" zostanie spełniony, zostanie zmianiona wartość zmiennej "zostan_w_petli". Jesli ona nie zostanie zmieniona, to nie bedzie mozliwosci opuszczenia jej. Jak czegos jeszcze nie rozumiesz, to pytaj :)

Edit: to raczej dotyczy tego co było wcześniej... tego z kropkami :)
Ostatnio zmieniony 2004-07-31, 11:26 przez Sad Mephisto, łącznie zmieniany 1 raz.
[i]Thank you for noticing this notice. Now that you've noticed this notice, you may have noticed that this notice is noticably unnoticable.
$ python -c "print int(''.join(map(lambda x: str(len(x)),'Kto z woli i myśli zapragnie Pi spisać cyfry ten zdoła.'.split())))/1e+10"[/i]
DanielLinux
Użytkownik
Posty: 552
Rejestracja: 2004-06-11, 17:24

Re: bash skrypt

Post autor: DanielLinux »

sayetan pisze:eh nie kumam tego totalnie, z tego co widzialem to wszystkie przyklady operuja na jednym warunku
i jezeli warunek zostanie spelniony on wykonuje jakas komende, jezeli nie to wychodzi
wiec jak teraz zrobic zeby przy niezpelnionym warunku dodac jeszcze dwa inne warunki?
czarnia magia a przykladziki tego nie opsiuja, byc moze jestem na to za glupi
moze jakis maly przykladzik jak to rozplatac ?! :P
To wygląda mniej więcej tak:

Kod: Zaznacz cały

if [ tutaj warunek ];
then
      polecenie
else 
      polecenie
elif [ warunek ];
then 
      polecenie
fi 
i tak to wygląda.
Pozdrawiam [/code]
Awatar użytkownika
mina86
Moderator
Posty: 3343
Rejestracja: 2004-06-14, 21:58
Lokalizacja: Linux 5.x x86_64
Kontakt:

Re: bash skrypt

Post autor: mina86 »

Advanced Bash-Scripting Guide -> http://www.tldp.org/LDP/abs/html/


1.

Kod: Zaznacz cały

SCIEZKA=""
DEFAULT="/jakas/sciezka/domyslna"

while [ -z "$SCIEZKA" ]; do
        echo -n "Podaj sciezka [$DEFAULT]: "
        read SCIEZKA

        if [ -z "$SCIEZKA" ]; then    # pusto
                SCIEZKA=$DEFAULT
        fi
        SCIEZKA=${SCIEZKA%%/}/        # tylko jeden '/' na koncu

        if [ ! -d "$SCIEZKA" ]; then  # nie katalog
                echo To nie katalog
                SCIEZKA=""
        fi
done

2. $1, $2 i tak dalej są to kolejne argumenty. To co chcesz osiągnąć możesz zrobić w następujący sposób:

Kod: Zaznacz cały

DEST_DIR=""
TEMP_DIR=""
HOME_DIR=""   # nie uzywaj HOME bo to jest kat. domowy

while [ ! -z "$1" ]; do  # dopoki sa argumenty
        if [ ${1:0:7} == "--dest=" ]; then
                DEST_DIR=${1:7}
        elif [ ${1:0:7} == "--home=" ]; then
                HOME_DIR=${1:7}
        elif [ ${1:0:6} == "--tmp=" ]; then
                TEMP_DIR=${1:6}
        else
                echo Unknown argument: $1
        fi
        shift  # "przesun" argumenty o jeden
done

echo dest: $DEST_DIR
echo temp: $TEMP_DIR
echo home: $HOME_DIR

3. Po pierwsze: Zamiast `id -un` = root użyj $UID -eq 0
Po drugie: nie możesz się w ten sposób przelogować bo polecenie su uruchamia nową powłokę i twój skrypt przestaje być na moment uruchamiany i dopiero po tym jak su skończy działanie to skrypt wykonuje się dalej.


4

Kod: Zaznacz cały

echo Wpisz nazwy plików odzielone przecinkami:
read FILES

OLD_IFS=$IFS
IFS=$IFS,

for FILE in $FILES; do
        echo $FILE
done

IFS=$OLD_IFS
Ostatnio zmieniony 2004-07-31, 15:32 przez mina86, łącznie zmieniany 1 raz.
Zastrzegam sobie prawo nieanalizowania postów pisanych niepoprawną polszczyzną.
Post generated automatically by A.I. system code name ‘mina86’ in response to the previous one.
Awatar użytkownika
ahes
Użytkownik
Posty: 1047
Rejestracja: 2004-05-28, 10:44
Lokalizacja: Krakow
Kontakt:

Re: bash skrypt

Post autor: ahes »

robisz petle while [ 1 ]
i jesli warunek zly to dajesz continue i np. inkrementujesz zmienna lub dajesz read aby nadpisac zmienna.
jesli warunek dobry to break i wychodzi z petli
[b][url=http://rootnode.net]rootnode.net[/url] :: Konta shellowe z piekła[/b]
Awatar użytkownika
mina86
Moderator
Posty: 3343
Rejestracja: 2004-06-14, 21:58
Lokalizacja: Linux 5.x x86_64
Kontakt:

Re: bash skrypt

Post autor: mina86 »

ahes pisze:robisz petle while [ 1 ]
i jesli warunek zly to dajesz continue i np. inkrementujesz zmienna lub dajesz read aby nadpisac zmienna.
jesli warunek dobry to break i wychodzi z petli
Nieeee... bez sensu.. Kozystanie z break i continue nie jest zalecane szczególnie gdy można poradzić sobie bez tych instrukcji.
Zastrzegam sobie prawo nieanalizowania postów pisanych niepoprawną polszczyzną.
Post generated automatically by A.I. system code name ‘mina86’ in response to the previous one.
Awatar użytkownika
ahes
Użytkownik
Posty: 1047
Rejestracja: 2004-05-28, 10:44
Lokalizacja: Krakow
Kontakt:

Re: bash skrypt

Post autor: ahes »

mina86 pisze: Nieeee... bez sensu.. Kozystanie z break i continue nie jest zalecane szczególnie gdy można poradzić sobie bez tych instrukcji.
masz racje, ale warto poznac alternatywe. szczegolnie jesli przypomina konstrukcje z C. wedlug mnie konstrukcja ${parametr%slowo} bedzie tutaj najlepszym rozwiazaniem.
[b][url=http://rootnode.net]rootnode.net[/url] :: Konta shellowe z piekła[/b]
Awatar użytkownika
mina86
Moderator
Posty: 3343
Rejestracja: 2004-06-14, 21:58
Lokalizacja: Linux 5.x x86_64
Kontakt:

Re: bash skrypt

Post autor: mina86 »

ahes pisze:wedlug mnie konstrukcja ${parametr%slowo} bedzie tutaj najlepszym rozwiazaniem.
Faktycznie, zupełnie o tym zapomniałem.. Zmieniłem już w moim skrypcie..
Zastrzegam sobie prawo nieanalizowania postów pisanych niepoprawną polszczyzną.
Post generated automatically by A.I. system code name ‘mina86’ in response to the previous one.
sayetan
Moderator w st. spocz.
Posty: 2193
Rejestracja: 2004-06-20, 21:47
Lokalizacja: Jelenia Góra

Re: bash skrypt

Post autor: sayetan »

mina86 pisze:Advanced Bash-Scripting Guide -> http://www.tldp.org/LDP/abs/html/
hrhr, czytalem ale nie moglem znalezc tam odpowednich przykladow, teraz chyba poczytam od poczatku :D
mina86 pisze:

Kod: Zaznacz cały

SCIEZKA=""
DEFAULT="/jakas/sciezka/domyslna"

while [ -z "$SCIEZKA" ]; do
        echo -n "Podaj sciezka [$DEFAULT]: "
        read SCIEZKA

        if [ -z "$SCIEZKA" ]; then    # pusto
                SCIEZKA=$DEFAULT
        fi
        SCIEZKA=${SCIEZKA%%/}/        # tylko jeden '/' na koncu

        if [ ! -d "$SCIEZKA" ]; then  # nie katalog
                echo To nie katalog
                SCIEZKA=""
        fi
done
chcialbym abys potwierdzil i ewentualnie mnie poprawil, tlumaczac na polski:
dopoki $SCIEZKA jest pusta(czyli nie ma zadnej wartosci) wykonaj "echo bblablal..."
jezeli $SCIEZKA jest pusta ustal SCIEZKA z $DEFAULT
SCIEZKA=SCIEZKA z tym ze sparawdza czy / jest na koncu wzorca, jezeli nie to dopisuje(dobrze mowie?)
jezel sciezka nie jest rowna katalogowi: echo "blebleble"
mina86 pisze: 2. $1, $2 i tak dalej są to kolejne argumenty. To co chcesz osiągnąć możesz zrobić w następujący sposób:

Kod: Zaznacz cały

DEST_DIR=""
TEMP_DIR=""
HOME_DIR=""   # nie uzywaj HOME bo to jest kat. domowy

while [ ! -z "$1" ]; do  # dopoki sa argumenty
        if [ ${1:0:7} == "--dest=" ]; then
                DEST_DIR=${1:7}
        elif [ ${1:0:7} == "--home=" ]; then
                HOME_DIR=${1:7}
        elif [ ${1:0:6} == "--tmp=" ]; then
                TEMP_DIR=${1:6}
        else
                echo Unknown argument: $1
        fi
        shift  # "przesun" argumenty o jeden
done

echo dest: $DEST_DIR
echo temp: $TEMP_DIR
echo home: $HOME_DIR
a wiec tak jak napisales dopoki argument $1 nie jest pusty rob....
chcialbym sie dokladnie dowiedziec co to jest ${1:0:7} domyslam sie ze to jest rozwiniecie $1
z czytania manuala dowiedzialem sie ze jest to parametr:offset:długość czyli:
dla argumentu $1 pierwsze 7 znakow w lancuchu jest puste, inaczej - nie jest w ogole interpretowane, dobrze mysle?
shift - przesuwa argument o jeden czyli majac trzy argumenty $1 i uzyjemy shift to on i tak je ponumeruje wg. kolejnosci?
mina86 pisze: 3. Po pierwsze: Zamiast `id -un` = root użyj $UID -eq 0
Po drugie: nie możesz się w ten sposób przelogować bo polecenie su uruchamia nową powłokę i twój skrypt przestaje być na moment uruchamiany i dopiero po tym jak su skończy działanie to skrypt wykonuje się dalej.
dzieki za rade o $UID, juz tak wykonalem, co do su, czyli nie da sie w jednym skrypcie zrobic aby automatycznie przelogowywal?
w sumie to mam juz jeden pomysl z if [ $UID -ne 0 ]; then oraz if [ $UID -eq 0 ]; then ale potem popatrze
mina86 pisze: 4

Kod: Zaznacz cały

echo Wpisz nazwy plików odzielone przecinkami:
read FILES

OLD_IFS=$IFS
IFS=$IFS,

for FILE in $FILES; do
        echo $FILE
done

IFS=$OLD_IFS
hm, co do tego przykladu to w sumie ja mialem podobny ale nie o tym chcialem
chodzi o to ze moj i Twoj skrypt pobierajac nazwy(oddzielone znakiem ',') z FILES ucina z nich znak ',' i robi spacje(tak wyczytalem z man bash)
problem w tym ze jak np, ustale

Kod: Zaznacz cały

echo Wpisz nazwy plików odzielone przecinkami:
read FILES

OLD_IFS=$IFS
IFS=$IFS,

for FILE in $FILES; do
        echo $FILE
done

IFS=$OLD_IFS
to on listuje te pliki ale w rzedach a mi raczej chodzilo o wykorzystanie tablic, cos takiego:

Kod: Zaznacz cały

echo Wpisz nazwy plików odzielone przecinkami:
read FILES

OLD_IFS=$IFS
IFS=$IFS,

for FILE in $FILES; do
        echo $FILE
done

IFS=$OLD_IFS

FILE=( wynik z $FILES zmieniony juz)  # w nawiasach bo to tablica, a nastepnie

/jakis/program --parametr-programu=${FILE[0]} --parametr-programu=${FILE[1]} itd..
problem w tym ze nawet keidy nie uzyje IFS i nazwy plikow wpisywane beda ze spacja to i tak beda on w rzedach a nie w jednym
da sie to jakos zlepic zeby read, przekazywalo wszystko co dostanie na jedna linijke ?


Dzieki Wielkie za Wasze rady, bardzo mi pomogly :)
nie wiedzialem ze watek se tak ozywi hrhr
ODPOWIEDZ