Skryptowanie powłoki (bash)
Skrypt powłoki jest plikiem tekstowym zawierającym listę poleceń powłoki i jest wykonywany jak program w celu wykonania zadania lub zestawu zadań. Podstawowym celem skryptu powłoki jest automatyzacja zadań i oszczędność czasu. Ważne jest, by zrozumieć podstawową strukturę skryptu powłoki, ponieważ to użytkownik wchodzi w interakcję z klastrami obliczeniowymi poprzez skrypty powłoki (Zobacz następny rozdział o Grid Engine)
co to jest Bash?
W systemach uniksopodobnych dostępnych jest wiele różnych powłok. Bourne Again Shell (Bash) jest jedną z nich, jest to domyślna powłoka w systemach GNU/Linux. Ma ona pewne zalety w porównaniu z innymi powłokami i jest całkiem standardową powłoką, a my pokażemy jak używać jej do pisania skryptów poniżej.
Pisanie prostego skryptu powłoki bash
Podstawowy skrypt powłoki jest po prostu serią poleceń. To jest to, co pokażemy dalej.
Piszemy prosty skrypt, który wypisuje „hello world” na ekranie za pomocą polecenia echo
. Zapiszemy plik tekstowy jako myScript.sh
#!/bin/bash echo Hello World
wykonanie skryptu powłoki składnia:bash your-script-name
. W naszym przypadku piszemy:
$ bash myScript.sh Hello World
bardziej skomplikowany przykład
Napiszmy nieco bardziej skomplikowany skrypt wykorzystujący więcej poleceń powłoki. Skrypt używa ls
do listowania plików i używa polecenia wc -l
, które zlicza liczbę linii w danym pliku lub standardowym wejściu. W tym przypadku, wc -l
zlicza liczbę linii na wyjściu ls -l
. Wszystko to osiągnęliśmy za pomocą pipe’a |
.
Zawartość skryptu script.sh:
#!/bin/bash echo here are the list of files ls -l echo The number of files: ls -l | wc -l
Możemy go wykonać w następujący sposób:
$ bash script.sh
zmienne w skryptach basha
W skryptach basha można również używać zmiennych. Są one przydatne do przechwytywania danych wyjściowych poleceń pośrednich i używania ich do uruchamiania innych poleceń.Nie ma typów danych dla zmiennych. Zmienna w bashu może zawierać dowolny z następujących elementów: liczbę, znak lub ciąg znaków.
Nie musisz deklarować zmiennej, wystarczy, że przypiszesz wartość do jej referencji, aby ją utworzyć.
Teraz utworzymy prosty skrypt z jedną zmienną. Przypiszemy do tej zmiennej Hello world
łańcuch znaków i wypiszemy tę zmienną z echo
.
#!/bin/bash VAR="Hello world" echo $VAR
Przy przypisywaniu zmiennej nie użyliśmy znaku $
, ale przy używaniu zmiennej musieliśmy użyć znaku $
.
argumenty wiersza poleceń w skryptach basha
Skrypta mogą również przyjmować argumenty wiersza poleceń. Tutaj zmodyfikujemy skrypt wypisujący plik tak, aby przyjmował argument wiersza poleceń. Argumentem będzie ścieżka do katalogu.
zawartość skryptu2.sh:
#!/bin/bash VAR= echo here are the list of files ls -l $VAR echo The number of files: ls -l $VAR | wc -l
Oto jak uruchamiamy skrypt:
$ bash script2.sh /home/user/project
Argumenty są przechowywane w zmiennych z numerem w kolejności argumentu, zaczynając od 1
- Pierwszy argument: $1
- Second Argument: $2
- i tak dalej…
W naszym przypadku odpowiada
/home/user/project
.
Operacje arytmetyczne w skryptach bash
Operacje arytmetyczne na liczbach całkowitych w bash są wykonywane w następującym formacie:
#!/bin/bash x=6 y=2 $((10 - 5)) $((x-y)) echo $((x-y)) echo $((10-5))
Możesz również skopiować i wkleić te polecenia do konsoli, aby zobaczyć, jak działają. Polecenia echo
powinny wyprowadzić 4
i 5
.
Arytmetyka Bash nie obsługuje zmiennoprzecinkowych (np. 1,3 -1 operacja nie będzie działać w bashu), musisz użyć polecenia bc
. Zobacz ten przykład stackOverflow dla przykładu, jak użyć bc
.
Pętla nad plikami
Jeśli próbujesz zautomatyzować zadanie używając skryptów bash, jest bardzo prawdopodobne, że będziesz musiał zastosować pewne polecenia na każdym pliku w katalogu. Można to osiągnąć za pomocą dzikich znaków*
i pętli for
. Poniższy skrypt zapisuje wszystkie pliki ’.txt’ z katalogu /path/to
w zmiennej FILES
. Następnie, dla każdego pliku oblicza liczbę linii i wypisuje ją poleceniem wc -l
.
#!/bin/bash FILES=/path/to/*.txt for f in $FILES do echo "Processing $f file..." # count number of lines and output that for file $f wc -l $f done
Więcej o skryptach bash
Możesz napisać jeszcze bardziej skomplikowane skrypty powłoki używając struktur kontrolnych (pętle if/else, for/while) i osiągnąć wiele używając skryptów powłoki, ale to jest poza zakresem tego dokumentu. Zobacz poniższe linki, jeśli chcesz się poprawić w pisaniu skryptów powłoki.
- http://www.freeos.com/guides/lsst/
- http://www.tldp.org/LDP/Bash-Beginners-Guide/html/
.