Lab 03
Uwagi do ćwiczeń
Tworzymy sprawozdanie z wykonanych czynności
Proszę o wykonywanie poniższych ćwiczeń dokumentując rezultaty
- zapisanie numeru polecenia w nagłówku
- opis czynności
- wykonywanie zrzutów ekranu
- umieszczanie tych zrzutów jako zawartości do dowolnego edytora tekstu np. Word, Writer
- w żadnym przypadku nie kopiujemy manual-a lub helpa
Sprawozdanie zapisujemy w formacie PDF i przesyłamy do systemu jako potwierdzenie swojego udziału w zajęciach i wykonania ćwiczeń.
Plik sprawozdania proszę zapisać jako: Sprawozdanie_lab03_JanKowalski.pdf, dla studenta o nazwisku Jan Kowalski.
Informacje wstępne
Zapoznaj się z podstawowymi elementami programowania w powłoce bash oraz rozwiąż zadania umieszczone na końcu tekstu.
PROGRAMOWANIE W BASH’U
Lista słów zastrzeżonych:
!
case
do
done
elif
else
esac
fi
for
function
if
in
select
then
until
while
{
}
time
\[
\]
WAŻNIEJSZE POLECENIA POWŁOKI:
Instrukcja | Składnia | Przykład |
if | if warunek then polecenie1 else polecenie2 fi | if [ -e ~/.bashrc ] then echo "Masz plik.bashrc" else echo "Nie masz pliku .bashrc" fi |
case | case zmienna in "wzorzec1") polecenie1 ;; "wzorzec2") polecenie2 ;; "wzorzec3") polecenie3 ;; *) polecenie_domyślne esac | echo "Podaj cyfrę dnia tygodnia" read d case "$d" in "1") echo "Poniedziałek" ;; "2") echo "Wtorek" ;; "3") echo "Środa" ;; "4") echo "Czwartek" ;; "5") echo "Piątek" ;; "6") echo "Sobota" ;; "7") echo "Niedziela" ;; *) echo "Nic nie wybrałeś" esac |
for | for zmienna in lista do polecenie done | for x in jeden dwa trzy do echo "To jest $x" done |
while | while warunek do polecenie done | x=1; while [ $x -le 10 ]; do echo "Napis pojawił się po raz: $x" x=$[x + 1] done |
until | until warunek do polecenie done | x=1; until [ $x -ge 10 ]; do echo "Napis pojawił się po raz: $x" x=$[x + 1] done |
read | read -opcje nazwa_zmiennej | echo -n "Wpisz coś:\a" read wpis echo "$wpis" |
Kilka przykładów operatorów polecenia “test”
- -a plik istnieje
- - plik istnieje i jest plikiem znakowym
- -e plik istnieje
- -h plik istnieje i jest linkiem symbolicznym
- = sprawdza czy wyrażenia są równe
- != sprawdza czy wyrażenia są różne
- -n wyrażenie ma długość większą niż 0
- -d wyrażenie istnieje i jest katalogiem
- -z wyrażenie ma zerową długość
- -r można czytać plik
- -w można zapisywać do pliku
- -x można plik wykonać
- -f plik istnieje i jest plikiem zwykłym
- -N plik istnieje i był zmieniany od czasu jego ostatniego odczytu
- plik1 -nt plik2 plik1 jest nowszy od pliku2
- plik1 -ot plik2 plik1 jest starszy od pliku2
- -lt mniejsze niż
- -gt większe niż
- -ge większe lub równe
- -le mniejsze lub równe
Zmienne
Ekspansja wyrażen
W powłoce Bash, różne typy cudzysłowów (""
i ''
) mają różne zachowania w odniesieniu do interpretacji zawartych w nich ciągów znaków. Oto główne cechy obu typów:
1. Podwójne Cudzysłowy ""
-
Ekspansja Zmiennych: Wewnątrz podwójnych cudzysłowów, zmienne są rozwijane (expanded). Oznacza to, że wartość zmiennej zostanie wstawiona w miejsce jej nazwy. Na przykład,
$HOME
zostanie zastąpione rzeczywistą ścieżką katalogu domowego użytkownika.1
echo "Twój katalog domowy to: $HOME"
-
Ekspansja Poleceń: Podwójne cudzysłowy pozwalają na ekspansję poleceń. Oznacza to, że polecenie umieszczone wewnątrz
$(...)
lub w starszej notacji`...`
zostanie wykonane, a jego wynik zostanie wstawiony w miejsce ekspansji.1
echo "Aktualna data to: $(date)"
-
Ekspansja Wyrażeń Arytmetycznych: Wyrażenia arytmetyczne umieszczone w
$((...))
są rozwijane i obliczane.1
echo "Dwa plus dwa to: $((2 + 2))"
-
Zachowanie Niektórych Znaków Specjalnych: Znaki takie jak
\n
(nowa linia) są interpretowane i przetwarzane.
2. Pojedyncze Cudzysłowy ' '
-
Brak Ekspansji Zmiennych i Poleceń: Wewnątrz pojedynczych cudzysłowów, ekspansja zmiennych, poleceń i wyrażeń arytmetycznych nie zachodzi. Cały tekst jest traktowany dosłownie, jako stały ciąg znaków.
1
echo 'Twój katalog domowy to: $HOME'
-
Dosłowna Interpretacja Zawartości: Wszystko, co znajduje się w pojedynczych cudzysłowach, jest interpretowane dosłownie. Oznacza to, że specjalne znaki Bash, takie jak
*
,&
,#
, itp., nie są interpretowane jako specjalne i są traktowane jako zwykłe znaki. -
Brak Interpretacji Znaków Ucieczki: Znaki ucieczki, takie jak
\n
, nie są interpretowane, ale są traktowane jako zwykłe znaki.
Special Parameters in Linux Bash/Shell
$0
Used to reference the name of the current shell or current shell script. so you can use this if you want to print the name of the current shell script.
$#
Reference the total number of parameters
$*
Reference to all parameters passed to the script (However, when double-quoted -> “$@” it will have different results from “$*”)
“$*” is equivalent to “$1c$2c…” , where c is the first character of the value of the IFS variable. If IFS is unset, the parameters are separated by spaces. If IFS is null, the parameters are joined without intervening separators.
$@
Reference to all parameters passed to the script (However, when double-quoted -> “$@” it will have different results from “$*”)
“$@” is equivalent to “$1” “$2” … .
$?
Exit status from last command in foreground
$$
Current Shell’s PID or Current script’s PID
In a () subshell, it expands to the process ID of the invoking shell, not the subshell.
$-
Expands to the current option flags as specified upon invocation, by the set builtin command, or those set by the shell itself (such as the -i option).
$_
At shell startup, set to the absolute pathname used to invoke the shell or shell script being executed as passed in the environment or argument list. Subsequently, expands to the last argument to the previous simple command executed in the foreground, after expansion. Also set to the full pathname used to invoke each command executed and placed in the environment exported to that command. When checking mail, this parameter holds the name of the mail file.
Other special characters, symbols
Comment
#
Comment a single line
$var
Prints the value of variable “var” defined within the script
$n
Positional Parameter: Print value of nth argument passed to the bash script
>
Redirect output
>>
Append to end of a file
<
Redirect input
()
Execute in subshell
Similar to {} but where commands within are executed in a subshell (a new process). Used much like a sandbox, if a command causes side effects (like changing variables), it will have no effect on the current shell.
[]
Matching any characters enclosed
Deprecated, an alias for the old test command. Commonly used in POSIX shell scripts. Lacks many features of [[ ]].
“
Used to substitute output of enclosed command
Deprecated, use $( ) instead.
|
Pipe output of last command’s results to next command as input
````` Escape character
&
Run any process in the background
?
Matching single character in filename
*
Matching any characters
;
Separate commands on the same line
~
Home directory
!
Command history
=
Assign a value to a variable e.g. dir=/var/log
Whitespace is not allowed on either side of the = character
[[]]
Test/Evaluate a condition expression to determine whether true or false , e.g. Checking file existence, compare values, strings etc.
{}
Inline group, commands inside the curly braces are treated as if they were one command.
(())
Arithmetic expression, characters such as +, -, *, and / are mathematical operators used for calculations. They can be used for variable assignments like (( a = 1 + 2 )) as well as tests like if (( a > b )).
$(())
Arithmetic expression, Comparable to the above, but the expression is replaced with the result of its arithmetic evaluation. Example: echo “The average is $(( (a+b)/10 ))”.
$[]
Arithmetic expression
Deprecated, use $(( )) instead.
Zadania
- Utwórz nowy plik o nazwie pierwszy (polecenie touch), a następnie zapisz w nim skrypt wypisujący na ekranie komunikat „Systemy operacyjne”
- Uzupełnij skrypt z zadania 1, tak by wypisywał także zawartość pliku .bashrc.
- Korzystając z polecenia ln, utwórz dwa dowiązania do programu z zadania 1 - nazwa dowiązania jest dowolna, pierwsze dowiązanie powinno być symboliczne natomiast drugie tzw. twarde, opisz w komentarzu zadania różnicę pomiędzy tymi dowiązaniami.
- Napisz skrypt moje_konto wypisujący informacje o nazwie Twojego konta, ścieżce dostępu do swojego katalogu głównego (użyj polecenia printenv | more, by zobaczyć wszystkie zmienne środowiskowe).
- Napisz skrypt wypisz wypisujący zawartość bieżącego katalogu wraz z pełną informacją o plikach i katalogach posiadających określone rozszerzenie podane jako parametr skryptu.
- Napisz skrypt sprawdzający czy plik podany jako parametr znajduje się w bieżącym katalogu.
- Napisz skrypt parametry wypisujący liczbę parametrów z jakimi został uruchomiony.
- Napisz skrypt wypisujący słownie cyfrę podaną przez użytkownika jako parametr wywołania tego skryptu. (np. dla parametru 2 skrypt zwróci słowo „dwa”).
- Napisz skrypt, który wykryje czy liczba podana jako parametr jest dodatnia.
- Napisz skrypt zwracający średnią arytmetyczną wszystkich liczb podanych jako parametry skryptu