[KURS] Programowanie w powłoce #2 – zmienne

[KURS] Programowanie w powłoce #2 - zmienne

Zmienne w Bashu to swojego rodzaju kontenery, ponieważ mogą przechowywać dowolne wartości. W tym artykule dowiesz się co to są: słowa zastrzeżone, zmienne programowe, zmienne specjalne, zmienne systemowe oraz zmienne tablicowe.

Kilka informacji na temat zmiennych, które warto zapamiętać:

  • zmienne nie wymagają deklaracji,
  • nazwa zmiennej nie może być słowem zastrzeżonym – o czym za chwilę,
  • wielkość liter w nazwie zmiennej jest istotna,
  • do zmiennej można przypisać wartość każdego typu – całkowity, rzeczywisty, znak, ciąg znaków etc.,
  • zmienna, która wcześniej przechowywała wartość „pewnego typu” może również przechowywać wartość „innego typu”,
  • do zawartości zmiennej odwołujemy się poprzez znak $.

Słowa zastrzeżone

Słowa zastrzeżone to nazwy, które zarezerwowane są już dla konkretnych instrukcji w powłoce. Nazwa zmiennej nie powinna być słowem zastrzeżonym (ale może).

Poniżej umieszczam listę słów zastrzeżonych:

  • !,
  • case,
  • do,
  • done,
  • elif,
  • else,
  • esac,
  • fi,
  • for,
  • function,
  • if,
  • in,
  • select,
  • then,
  • until,
  • while,
  • {,
  • },
  • time,
  • [,
  • ].

Zmienne programowe

Zmienne programowe to inaczej zmienne definiowane przez nas.

Zmienne definiujemy następująco:

zmienna1=3
zmienna2=3.14
zmienna3=PI
zmienna4="PI to w przyblizeniu 3.14"

Błędna jest definicja zawierająca spacje
Przykład:

zmienna = 1 #błąd!!!

Wielkość liter zmiennych jest istotna.
Przykład:

#!/bin/bash

int=2
Int=5

echo -e "Wartosc zmiennej int="$int
echo -e "Wartosc zmiennej Int="$Int

exit 0

Rezultat:

Wartosc zmiennej int=2
Wartosc zmiennej Int=5

Do zmiennej można przypisać zawartość jakiegoś polecenia. Polecenie przypisujemy do zmiennej na dwa sposoby:

  • poprzez użycie odwrotnych apostrofów ` – przycisk znajduje się pod klawiszem ESC,
zmienna=`polecenie`
  • poprzez ujęcie polecenia w nawias i poprzedzenie całości znakiem $
zmienna=$(polecenie)

Przykład:

#!/bin/bash

kto=`who`

echo -e "Zalogowani uzytkownicy: "$kto

exit 0

Zmienne specjalne

Zmienne specjalne to najbardziej prywatne zmienne powłoki, są udostępniane użytkownikowi tylko do odczytu (są wyjątki).
  • $0 – wyświetli nazwę bieżącego skryptu,
  • $1 .. $9 – parametry przesyłane do skryptu – można je modyfikować.

Przykład
Skrypt ma postać:

#!/bin/bash

echo -e $3 $2 $1

exit 0

Wywołujemy go w sposób następujący:

./nazwa_skryptu 1 2 3

Gdzie 1 2 3 to wartości przesyłane do skryptu.
Rezultat:

3 2 1
  • $@ – wyświetli wszystkie parametry przesłane do skryptu,
  • $? – kod powrotu ostatnio wykonywanego polecenia,
  • $$ – PID procesu bieżącej powłoki.

Zmienne systemowe

Zmienne systemowe to wbudowane zmienne. Aktualną ich listę wyświetlisz poleceniami set oraz printenv

Przykład:

#!/bin/bash

echo "Witaj $USER, Twoj katalog domowy to $HOME, nazwa i typ tego komputera to $HOSTNAME $HOSTTYPE, znajdujesz sie w katalogu $PWD" 

exit 0

Rezultat:

Witaj szmitas, Twoj katalog domowy to /home/szmitas, nazwa i typ tego komputera to szmitas-ubuntu i486, znajdujesz sie w katalogu /home/szmitas/Pulpit/pliki/programowanie/bash/ubuntu-pomoc/#2

Zmienne tablicowe

Zmienne tablicowe (tablice) stosujemy, gdy chcemy przechować wiele zmiennych. Kolejne wartości zmiennej tablicowej indeksowane są przy pomocy liczb całkowitych, zaczynając od 0. Nie istnieje możliwość tworzenia tablic wielowymiarowych. Rozmiar tablicy nie jest ograniczony – w każdym momencie możemy usuwać, bądź dodawać elementy.

Tablicę definiujemy w następujący sposób:

nazwa_tablicy=(wartość1 wartość2 wartość3 wartośćN)

Przykład:

#!/bin/bash

tablica=(1 5 10 -23)

echo -e ${tablica[0]}  ${tablica[1]} ${tablica[2]} ${tablica[3]}

exit 0

Rezultat:

1 5 10 -23

Tablica nie musi przechowywać wartości tego samego typu!
Przykład:

#!/bin/bash

tablica=(Liczba "pi = " 3.1415 ...)

echo -e ${tablica[0]}  ${tablica[1]} ${tablica[2]} ${tablica[3]}

exit 0

Rezultat:

Liczba pi = 3.1415 ...

Do poszczególnych elementów tablicy można odnosić się poprzez podanie konkretnego numeru elementu (przykład wyżej) lub za pomocą wskaźników – indeksujemy tablicę od zera!.
Przykład:

#!/bin/bash

tablica=(Liczba "pi = " 3.1415 ...)

i=0

while [ "$i" -le 3 ]
do
echo ${tablica[$i]}
i=$((i+1))
done

exit 0

Rezultat

Liczba
pi =
3.1415
...

Jeśli w odwołaniu się do tablicy nie podamy konkretnego elementu np.

echo ${tablica}

Zostanie wypisany pierwszy element.
Jeśli w odwołaniu się do elementu tablicy podamy @ lub * np.

echo ${tablica[*]}

Zostaną wypisane wszystkie elementy.

Dodawanie nowego elementu:
Rozmiar tablicy jest nieograniczony. Nowy element dodajemy w następujący sposób:

nazwa_tablicy[wskaźnik]=wartość

Oczywiście wartość zmiennej wskaźnik musi być większa niż wcześniejszy rozmiar tablicy, aby powiększenie miało sens.

Mechanizm dodawania elementów do tablicy, można wykorzystać do tworzenia tablic, gdy nie istnieje zmienna tablicowa do której dodajemy jakiś element, to BASH automatycznie ją utworzy

Usuwanie elementu z tablicy
Element tablicy usuwamy następująco:

unset nazwa_tablicy[wskaźnik]

Tablice są niezwykle przydatne w programowaniu, dlatego dobre ich zrozumienie jest bardzo ważne.


Jeżeli powyższy artykuł nie rozwiązał lub rozwiązał częściowo Twój problem, dodaj swój komentarz opisujący, w którym miejscu napotkałeś trudności.
Mile widziane komentarze z uwagami lub informacjami o rozwiązaniu problemu.
  • Zielony

    Szmitas , przyjacielu ,help !!
    Mam skrypt ,ktory z NEF’ow tworzy .jpg , jednak robi to w taki sposob :
    NEF_DIR=”nikon foto”
    JPG_DIR=”JpgFromRaw foto”
    tylko z katalogu ,ktory nazywa sie „nikon foto” . Ideał to klik na dowolny katalog z NEF’ami i utworzenie nowego katalogu z .jpg .
    Zrodło – http://ni.recoverydata.pl/content/konwersja-zdjęć-w-formacie-nef-do-jpg – skrypt pod nazwą – nef2jpg.sh.
    Pomocy !!

  • Zielony

    Dzieki za odpowiedz .

    • Daniel

      Rozwala mnie kiedy ktoś zostawi komentarz i oczekuje, że za 5 minut będzie miał pełną odpowiedź. Ile ta strona ma odwiedzin w ciągu 2 godzin? Jaka jest szansa, że ktoś kto czyta KURS ma na tyle dużą wiedzę, żeby Ci pomóc? Jaka jest szansa, że ktoś z tych osób, które chcą będą miały pół godziny czasu, żeby popracować nad rozwiązaniem? Cierpliwości.
      Internet – not your private army.

  • Zielony

    Zero pomyslow ?? Jest to za skomplikowane ??

  • Ania

    Gdybyś przeczytał artykuł, wiedziałbyś, że $PWD wyświetli Ci ścieżkę do katalogu, w którym obecnie jesteś. Wystarczy przypisać to do zmiennej NEF_DIR i przenosić skrypt do każdego katalogu.

  • Zielony

    Ania blagam ,tylko nie to – wszyscy pisza „stary to proste ,zrob to .. i tamto ”
    Zielony to moj nick i wiedza ,kumasz ??
    Napisz ,bo jestes jedyna osoba ,ktora pisze ,ze ma jakis pomysl – nawet koles ktory go wymyslil ( patrz -Zrodlo) padl i „zacial sie”.
    Jeszcze raz – mam katalog z setka NEF’ow – klikam PPM i ze skryptow wybieram ten.powyzszy.opisany i tworzy sie – nowy.katalog z .jpg.
    Jesli sie da to HELP !! Jesli nie to dzieki za odpowiedz.

    • Szmitas

      Ten artykuł jest właśnie dla osób zielonych.

      #!/bin/sh
      
      # Generate JPG BASIC files with EXIF data
      NEF_DIR="$PWD"
      JPG_DIR="~/foto"
      
      exiftool -b -JpgFromRaw -w "$JPG_DIR"/%f.jpg -ext NEF -r "$NEF_DIR"/
      exiftool -overwrite_original_in_place -tagsfromfile "$NEF_DIR"/%f.nef -ext JPG "$JPG_DIR"/

      Ten skrypt powinien być skopiowany do każdego katalogu, w którym masz zdjęcia. Uruchamiasz skrypt, on przerabia zdjęcia i wysyła je do katalogu foto w Twoim katalogu domowym. Niestety wymagania, które postawiłeś są zbyt wysokie, bo wymagają interwencji w menedżer okien (w tym przypadku Nautilusa).