[bash][solved] zmienna się nie ustawia

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
piotrekkr
Piegowaty Guziec
Piegowaty Guziec
Posty: 28
Rejestracja: 30 kwie 2007, 13:37
Płeć: Mężczyzna
Wersja Ubuntu: 11.10
Środowisko graficzne: Unity
Architektura: x86_64
Kontakt:

[bash][solved] zmienna się nie ustawia

Post autor: piotrekkr »

Witam dzisiaj się nudziłem i zacząłem robić skrypt w bashu. Jestem początkujący jeśli chodzi o basha więc proszę o wyrozumiałość :). Mam dziwny problem który wydaje się być trochę bez sensu:

Kod: Zaznacz cały

#!/bin/bash
E_INCORRECT_DEPTH=50
E_INCORRECT_DIRECTORY=51
 
hexadecimal=(0 1 2 3 4 5 6 7 8 9 a b c d e f)
created=()
if [[ -z "$1" || "$1" =~ ^[^0-9]+$ || $1 = 0 ]] 
then 
  echo "Nie podano poprawnej ilości poziomów katalogów"
  exit $E_INCORRECT_DEPTH
fi

path='.'

if [[ -n "$2" && ( ! -d $2  || ! -w $2 ) ]]
then 
  echo "Wpisany katalog nie istnieje lub nie masz praw do zapisu"
  exit $E_INCORRECT_DIRECTORY
else
  path=$2  
fi 

echo "sciezka $path"
exit
Drugi argument do skryptu jest opcjonalny. Jeśli nie został podany path powinna zawierać kropkę '.' a niestety jest pusta ;/ Nie wiem o co z tym chodzi. Jak zmienię że path='.' jest za ostatnim if'em to jest OK tyle że nadpisuję jej zawartość jeśli ktoś poda drugi argument. Ktoś wie o co chodzi?
Awatar użytkownika
Nadril
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 171
Rejestracja: 11 lip 2008, 10:54
Płeć: Mężczyzna
Wersja Ubuntu: 11.04
Środowisko graficzne: KDE Plasma
Architektura: x86_64
Kontakt:

Odp: [bash] zmienna się nie ustawia

Post autor: Nadril »

zmienna się ustawia, nawet dwukrotnie :)

jeżeli nie podasz drugiego argumentu, to warunek w ifie nie zostanie wypełniony (string $2 będzie miał zerową długość więc -n "$2" zwróci false. Idziemy więc do elsa, który nadpisuje zmienną path wartością zmiennej $2, która jak określilismy wcześniej jest w tym przypadku pusta.
piotrekkr
Piegowaty Guziec
Piegowaty Guziec
Posty: 28
Rejestracja: 30 kwie 2007, 13:37
Płeć: Mężczyzna
Wersja Ubuntu: 11.10
Środowisko graficzne: Unity
Architektura: x86_64
Kontakt:

Odp: [bash] zmienna się nie ustawia

Post autor: piotrekkr »

Dzięki pomogło :) Głupi błąd zrobiłem. Tak jeszcze zapytam przy okazji czy ktoś zna może jakiś dobry artykuł czy tam tutorial w którym opisane są metody filtrowania / sprawdzania i radzenia sobie z argumentami przekazanymi do skryptu. Chodzi mi np jak przetworzyć duże listy argumentów np:

Kod: Zaznacz cały

skrypt -v - h -d 20 --argument=wartosc cos_jeszcze
Są jakieś sprawdzone sposoby na takie coś? :)
Awatar użytkownika
Nadril
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 171
Rejestracja: 11 lip 2008, 10:54
Płeć: Mężczyzna
Wersja Ubuntu: 11.04
Środowisko graficzne: KDE Plasma
Architektura: x86_64
Kontakt:

Odp: [bash] zmienna się nie ustawia

Post autor: Nadril »

getopt
piotrekkr
Piegowaty Guziec
Piegowaty Guziec
Posty: 28
Rejestracja: 30 kwie 2007, 13:37
Płeć: Mężczyzna
Wersja Ubuntu: 11.10
Środowisko graficzne: Unity
Architektura: x86_64
Kontakt:

Odp: [bash] zmienna się nie ustawia

Post autor: piotrekkr »

Ok dzięki wielkie jeszcze tylko jedno pytanko dotyczące printf. Mam taki kod w skrypcie:

Kod: Zaznacz cały

msg="Tworzenie struktury katalogów w:"
printf "%-40s $path\n" $msg
msg="Stworzono katalog:"
printf "%-40s $path/${hexadecimal[$i]}\n" $msg
Nie mam pojęcia czemu robi mi tekst w kliku liniach?

Kod: Zaznacz cały

Tworzenie                                     ./f
struktury                                     ./f
katalogów                                    ./f
w:                                            ./f
Stworzono                                     ./f/0
katalog:                                      ./f/0
Awatar użytkownika
Nadril
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 171
Rejestracja: 11 lip 2008, 10:54
Płeć: Mężczyzna
Wersja Ubuntu: 11.04
Środowisko graficzne: KDE Plasma
Architektura: x86_64
Kontakt:

Odp: [bash] zmienna się nie ustawia

Post autor: Nadril »

Printf traktuje $msg jak kilka argumentów, bo są przecież rozdzielone spacjami. Żeby uzyskać to co prawdopodobnie chciałeś, powinno być:

Kod: Zaznacz cały

msg="Tworzenie struktury katalogów w:"
printf "%-40s $path\n" "$msg"
msg="Stworzono katalog:"
printf "%-40s $path/${hexadecimal[$i]}\n" "$msg"
piotrekkr
Piegowaty Guziec
Piegowaty Guziec
Posty: 28
Rejestracja: 30 kwie 2007, 13:37
Płeć: Mężczyzna
Wersja Ubuntu: 11.10
Środowisko graficzne: Unity
Architektura: x86_64
Kontakt:

Odp: [bash] zmienna się nie ustawia

Post autor: piotrekkr »

Ok dzięki raz jeszcze :) Ciągle nie mogę się przyzwyczaić żeby brać zmienne w cudzysłowy... :/
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 7 gości