Shell скриптинг – позициони параметри
У овом тексту ћемо проћи кроз позиционе параметре у shell скриптингу. Сваки пример ће почети са командом „cat“ која излистава садржај скрипте како би лакше дочарао понашање у реалном раду.
$$
даје PID скрипте унутар које се покреће. Обично се користи зарад праћења извршења скрипте.
[test@kompjuteras ~]$ cat skripta.sh #!/bin/bash echo $$ ; sleep 20 [test@kompjuteras ~]$ ./skripta.sh & [1] 2118 [test@kompjuteras ~]$ 2118 [test@kompjuteras ~]$ ps aux | grep skripta.sh | grep -v grep test 2118 0.0 0.0 106112 1196 pts/1 S 09:41 0:00 /bin/bash ./skripta.sh
$?
Даје exit code последње команде. Ако је 0 скрипта или команда се добро извршила, ако није нула – постоји нека грешка приликом извршавања
[test@kompjuteras ~]$ hostname -I 192.168.11.101 [test@kompjuteras ~]$ echo $? 0 [test@kompjuteras ~]$ hstnаme -I -bash: hstname: command not found [test@kompjuteras ~]$ echo $? 127
У овом примеру смо добили exit code 127 што представља грешку „command not found“. Стандардне exit кодове можете излистати овде. Постоје и нестандардни exit кодови које ви сами можете дефинисати а обично се користе код дебaгинга скрипте или праћења „где је скрипта пукла“. Пример:
# Ако је PID покренуте скрите једнак неком безвезе рендом броју # нека exit code буде стандардна нула а ако није нека буде 66 [test@kompjuteras ~]$ cat skripta.sh #!/bin/bash if [ `echo $$` -ne 8732198732 ] ; then exit 66 fi exit 0 [test@kompjuteras ~]$ ./skripta.sh [test@kompjuteras ~]$ echo $? 66
$@
Више прослеђених улазних параметара разбија на делове, тако да рецимо ./skripta.sh 1 2 3 4 као улазне параметре има „1“, „2“, „3“ и „4“ уместо „1 2 3 4“
[test@kompjuteras ~]$ cat skripta.sh #!/bin/bash # Ispisi mi sve ulazne parametre for i in "$@" do echo "Parametar: "$i done [test@kompjuteras ~]$ ./skripta.sh [test@kompjuteras ~]$ ./skripta.sh jedan dva 3 9 Parametar: jedan Parametar: dva Parametar: 3 Parametar: 9
$*
Све прослеђене параметре третира као један (супротно од претходног примера)
[test@kompjuteras ~]$ cat skripta.sh #!/bin/bash # Ispisi mi sve ulazne parametre for i in "$*" do echo "Parametar: "$i done [test@kompjuteras ~]$ ./skripta.sh jedan dva 3 9 Parametar: jedan dva 3 9
$#
Даје број прослеђених улазних параметара. Обично се користи код провере – да ли је унесено довољно параметара
[test@kompjuteras ~]$ cat skripta.sh #!/bin/bash echo "Skripta ima $# ulaznih parametara" [test@kompjuteras ~]$ ./skripta.sh Skripta ima 0 ulaznih parametara [test@kompjuteras ~]$ ./skripta.sh nč df 3 5 fefe Skripta ima 5 ulaznih parametara
$0
Даје назив програма или скрипте која се покреће са тренутном путањом
[test@kompjuteras ~]$ cat skripta.sh #!/bin/bash echo "Skripta se zove $0" [test@kompjuteras ~]$ ./skripta.sh Skripta se zove ./skripta.sh [test@kompjuteras ~]$ /home/test/skripta.sh Skripta se zove /home/test/skripta.sh
$1, $2…
Даје параметар који је дати редни број (нпр, $2 даје други прослеђени параметар)
[test@kompjuteras ~]$ cat skripta.sh #!/bin/bash echo "Drugi parametar je $2" [test@kompjuteras ~]$ ./skripta.sh nj ihf asfs Drugi parametar je ihf
$!
Даје pid најсвежије команде или скрипте. У примеру испод ћемо излистати pid који ћемо на крају убити на мртво…па проверити види ли се тај последњи pid
[test@kompjuteras ~]$ cat skripta.sh #!/bin/bash echo "Pid ove skripte je: $$" sleep 200 [test@kompjuteras ~]$ ./skripta.sh & [1] 5586 [test@kompjuteras ~]$ Pid ove skripte je: 5586 [test@kompjuteras ~]$ echo $! 5586 [test@kompjuteras ~]$ kill -9 5586 [test@kompjuteras ~]$ echo $! 5586
neodimijum
31/10/2016 @ 22:23
Moze mali help?
Sta se konkretno desava u skripti kada se koristi ${!#} tj sta tacno odradi ! na # pa mi on vrati poslednji prosledjen argument?
Primer: http://pastebin.com/7E8uibsX
bash verzija 4.3+