105.1 Lecke 2
Tanúsítvány: |
LPIC-1 |
---|---|
Verzió: |
5.0 |
Témakör: |
105 Shellek és shell scriptelés |
Fejezet: |
105.1 A shell testre szabása és használata |
Lecke: |
2/3 |
Bevezetés
Gondoljunk a változóra úgy, mint egy képzeletbeli dobozra, amelyben ideiglenesen elhelyezhetünk egy információt. Az inicializáló scriptekhez hasonlóan a Bash is a változókat shell/local (azok, amelyek csak annak a shellnek a határain belül élnek, amelyben létrehozták őket) vagy environment/global (azok, amelyeket a gyermek shell-ek és/vagy folyamatok örökölnek) kategóriákba sorolja. Valójában az előző leckében a shelleket és azok konfigurációs vagy inicializálási scriptjeit néztük meg. Most célszerű rámutatni, hogy ezeknek az indítófájloknak az ereje abban rejlik, hogy lehetővé teszik számunkra, hogy olyan változókat — valamint aliasokat és függvényeket — használjunk, amelyek segítségével létrehozhatjuk és testre szabhatjuk a kívánt shell környezetet.
Változók: Hozzárendelés és hivatkozás
A változót úgy lehet definiálni, mint egy értéket tartalmazó nevet.
A Bash nyelvben a névhez való értékadást változó hozzárendelésnek (variable assignment) nevezik, és ez a módja annak, ahogyan változókat hozunk létre vagy állítunk be. Másrészt a névben szereplő érték elérésének folyamatát változó hivatkozásnak (variable referencing) nevezzük.
A változók hozzárendelésének szintaxisa a következő:
<valtozo_neve>=<valtozo_erteke>
Például:
$ distro=zorinos
A distro
változó egyenlő zorinos
-sal, vagyis van egy memóriarész, amely a zorinos
értéket tartalmazza — a distro
pedig az erre mutató pointer.
Vegyük azonban figyelembe, hogy a változó hozzárendelésekor az egyenlőségjel egyik oldalán sem lehet szóköz:
$ distro =zorinos -bash: distro: command not found $ distro= zorinos -bash: zorinos: command not found
A hibánk miatt a Bash a distro
-t és a zorinos
-t is parancsnak olvasta.
Egy változóra való hivatkozáshoz (azaz értékének ellenőrzéséhez) az echo
parancsot használjuk, a változó neve előtt egy $
jellel:
$ echo $distro zorinos
Változók nevei
A változók nevének kiválasztásakor bizonyos szabályokat figyelembe kell vennünk.
A változó neve tartalmazhat betűket (a-z
,A-Z
), számokat (0-9
) és alulvonásokat (_
):
$ distro=zorinos $ echo $distro zorinos $ DISTRO=zorinos $ echo $DISTRO zorinos $ distro_1=zorinos $ echo $distro_1 zorinos $ _distro=zorinos $ echo $_distro zorinos
Nem kezdődhet számmal, különben Bash összezavarodik:
$ 1distro=zorinos -bash: 1distro=zorinos: command not found
Nem tartalmazhat szóközöket (még idézőjelek használatával sem); a konvenció szerint helyette alulvonásokat használunk:
$ "my distro"=zorinos -bash: my: command not found $ my_distro=zorinos $ echo $my_distro zorinos
Változók értékei
A változók referenciájával vagy értékével kapcsolatban szintén fontos figyelembe venni néhány szabályt.
A változók tartalmazhatnak bármilyen alfanumerikus karaktert (a-z
,A-Z
,0-9
), valamint a legtöbb egyéb karaktert (?
,!
,*
,.
,/
, stb.):
$ distro=zorin12.4? $ echo $distro zorin12.4?
A változók értékeit idézőjelek közé kell zárni, ha szimpla szóközöket tartalmaznak:
$ distro=zorin 12.4 -bash: 12.4: command not found $ distro="zorin 12.4" $ echo $distro zorin 12.4 $ distro='zorin 12.4' $ echo $distro zorin 12.4
A változó értékeit is idézőjelek közé kell zárni, ha olyan karaktereket tartalmaznak, mint az átirányításhoz használt karakterek (<
,>
) vagy a pipe (|
). A következő parancs csak annyit tesz, hogy létrehoz egy üres zorin
nevű fájlt:
$ distro=>zorin $ echo $distro $ ls zorin zorin
Ez azonban akkor működik, ha az idézőjeleket használjuk:
$ distro=">zorin" $ echo $distro >zorin
Az egyszerű és a kettős idézőjelek azonban nem mindig felcserélhetők egymással. Attól függően, hogy mit csinálunk egy változóval (hozzárendelés vagy hivatkozás), az egyik vagy a másik használata következményekkel jár, és különböző eredményeket hoz. A változó hozzárendelésével összefüggésben az egyszerű idézőjelek a változó értékének minden karakterét szó szerint átveszik, míg a kettős idézőjelek lehetővé teszik a változó helyettesítését:
$ lizard=uromastyx $ animal='My $lizard' $ echo $animal My $lizard $ animal="My $lizard" $ echo $animal My uromastyx
Másrészt, amikor olyan változóra hivatkozunk, amelynek értéke tartalmaz néhány kezdeti (vagy extra) szóközt — néha csillagokkal kombinálva --, akkor kötelező dupla idézőjeleket használni a echo
parancs után, hogy elkerüljük a mezőfelosztást (field splitting) és az elérési út nevének kiterjesztését (pathname expansion):
$ lizard=" genus | uromastyx" $ echo $lizard genus | uromastyx $ echo "$lizard" genus | uromastyx
Ha a változó hivatkozása záró felkiáltójelet tartalmaz, akkor ennek kell lennie a string utolsó karakterének (különben a Bash azt fogja hinni, hogy egy history
eseményre hivatkozunk):
$ distro=zorin.?/!os -bash: !os: event not found $ distro=zorin.?/! $ echo $distro zorin.?/!
A backslasheket egy másik backslashsel kell kivédeni (escape). Továbbá, ha a backslash az utolsó karakter a stringben, és nem védjük ki, a Bash úgy fogja értelmezni, hogy sortörést akarunk, és új sort ad nekünk:
$ distro=zorinos\ > $ distro=zorinos\\ $ echo $distro zorinos\
A következő két szakaszban összefoglaljuk a lokális (local) és a környezeti (environment) változók közötti főbb különbségeket.
Lokális vagy shell változók
A lokális vagy shell változók csak abban a shellben léteznek, amelyben létrehozták őket. A helyi változókat egyezményesen kisbetűvel írjuk.
Néhány teszt elvégzéséhez hozzunk létre egy lokális változót! A fentieknek megfelelően válasszunk egy megfelelő változónevet, és tegyük egyenlővé egy megfelelő értékkel! Például:
$ reptile=tortoise
Most használjuk a echo
parancsot, hogy hivatkozzunk a változóra, és ellenőrizzük, hogy minden a várt módon történt-e:
$ echo $reptile tortoise
Bizonyos esetekben - például scriptek írása során - a változtathatatlanság érdekes tulajdonsága lehet a változóknak. Ha azt akarjuk, hogy a változóink megváltoztathatatlanok legyenek, akkor létrehozhatjuk őket readonly
módon:
$ readonly reptile=tortoise
Vagy átalakíthatjuk őket a létrehozás után:
$ reptile=tortoise $ readonly reptile
Ha most megpróbáljuk megváltoztatni a reptile
értékét, a Bash elutasítja:
$ reptile=lizard -bash: distro: readonly variable
Note
|
Az aktuális munkamenetben lévő összes olvasható változó listázásához írjuk be a terminálba a |
A helyi változók kezelésénél hasznos parancs a set
.
A set
kiírja az összes aktuálisan hozzárendelt shellváltozót és függvényt. Mivel ez sok sor lehet (próbáljuk ki!), ajánlott egy olyan lapozóval együtt használni, mint a less
:
$ set | less BASH=/bin/bash BASHOPTS=checkwinsize:cmdhist:complete_fullquote:expand_aliases:extglob:extquote:force_fignore:histappend:interactive_comments:login_shell:progcomp:promptvars:sourcepath BASH_ALIASES=() BASH_ARGC=() BASH_ARGV=() BASH_CMDS=() BASH_COMPLETION_COMPAT_DIR=/etc/bash_completion.d BASH_LINENO=() BASH_SOURCE=() BASH_VERSINFO=([0]="4" [1]="4" [2]="12" [3]="1" [4]="release" [5]="x86_64-pc-linux-gnu") BASH_VERSION='4.4.12(1)-release' (...)
Ott van a reptile
változónk?
$ set | grep reptile reptile=tortoise
Igen, itt van!
Azonban a reptile
- mivel lokális változó - nem öröklődik az aktuális shellből indított gyermekfolyamatokra:
$ bash $ set | grep reptile $
És természetesen az értékét sem tudjuk kiíratni:
$ echo $reptile $
Note
|
A |
Bármely változó (akár helyi, akár globális) visszavonásához az unset
parancsot használjuk:
$ echo $reptile tortoise $ unset reptile $ echo $reptile $
Note
|
Az |
Globális vagy környezeti változók
A globális (global) vagy környezeti (environment) változók az aktuális shellhez, valamint az abból indított összes későbbi folyamathoz tartoznak. A környezeti változókat konvenció szerint nagybetűvel írjuk:
$ echo $SHELL /bin/bash
Ezeknek a változóknak az értékét rekurzívan átadhatjuk más változóknak, és az utóbbiak értéke végül az előbbiek értékére fog bővülni:
$ my_shell=$SHELL $ echo $my_shell /bin/bash $ your_shell=$my_shell $ echo $your_shell /bin/bash $ our_shell=$your_shell $ echo $our_shell /bin/bash
Ahhoz, hogy egy lokális shell változó környezeti változóvá váljon, az export
parancsot kell használni:
$ export reptile
Az export reptile
segítségével a helyi változót környezeti változóvá alakítottuk, hogy a gyermek shellek is felismerhessék és használhassák:
$ bash $ echo $reptile tortoise
Hasonlóképpen, az export
is használható egy változó beállítására és exportálására, egyszerre:
$ export amphibian=frog
Most már megnyithatunk egy új Bash-példányt, és sikeresen hivatkozhatunk az új változóra:
$ bash $ echo $amphibian frog
Note
|
Az |
Az export
parancs önmagában (vagy a -p
opcióval) beírva az összes létező környezeti változó listáját is megadja:
$ export declare -x HOME="/home/user2" declare -x LANG="en_GB.UTF-8" declare -x LOGNAME="user2" (...) declare -x PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games" declare -x PWD="/home/user2" declare -x SHELL="/bin/bash" declare -x SHLVL="1" declare -x SSH_CLIENT="192.168.1.10 49330 22" declare -x SSH_CONNECTION="192.168.1.10 49330 192.168.1.7 22" declare -x SSH_TTY="/dev/pts/0" declare -x TERM="xterm-256color" declare -x USER="user2" declare -x XDG_RUNTIME_DIR="/run/user/1001" declare -x XDG_SESSION_ID="8" declare -x reptile="tortoise"
Note
|
A |
Két további parancs, amely az összes környezeti változó listájának kiírására használható, az env
és a printenv
:
$ env SSH_CONNECTION=192.168.1.10 48678 192.168.1.7 22 LANG=en_GB.UTF-8 XDG_SESSION_ID=3 USER=user2 PWD=/home/user2 HOME=/home/user2 SSH_CLIENT=192.168.1.10 48678 22 SSH_TTY=/dev/pts/0 MAIL=/var/mail/user2 TERM=xterm-256color SHELL=/bin/bash SHLVL=1 LOGNAME=user2 XDG_RUNTIME_DIR=/run/user/1001 PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games _=/usr/bin/env
Amellett, hogy az env
szinonimája, a printenv
-t néha hasonló módon használhatjuk, mint ahogy az echo
parancsot egy változó értékének ellenőrzésére:
$ echo $PWD /home/user2 $ printenv PWD /home/user2
Figyeljük meg azonban, hogy a printenv
esetén a változó neve előtt nem szerepel a $
!
Note
|
A |
Program futtatása módosított környezetben
Az env
a shell környezet módosítására használható a program végrehajtásának idején.
Ahhoz, hogy egy új Bash munkamenetet a lehető legüresebb környezettel indítsunk — a legtöbb változót (valamint függvényeket és aliasokat) törölve — az env
-t fogjuk használni az -i
kapcsolóval:
$ env -i bash
Most a legtöbb környezeti változó eltűnt:
$ echo $USER $
És csak néhány maradt meg:
$ env LS_COLORS= PWD=/home/user2 SHLVL=1 _=/usr/bin/printenv
Az env
-t használhatjuk arra is, hogy egy adott változót beállítsunk egy adott programhoz.
Az előző leckében, amikor a non-interaktív, non-login shelleket tárgyaltuk, láttuk, hogy a scriptek nem olvasnak be semmilyen szabványos indítófájlt, hanem a BASH_ENV
változó értékét keresik, és azt használják indítófájlként, ha létezik.
Hadd mutassuk be ezt a folyamatot:
-
Létrehozzuk a saját indítófájlunkat
.startup_script
néven a következő tartalommal:CROCODILIAN=caiman
-
Írunk egy
test_env.sh
nevű Bash scriptet a következő tartalommal:#!/bin/bash echo $CROCODILIAN
-
Beállítjuk az executable bitet a
test_env.sh
scriptünkhöz:$ chmod +x test_env.sh
-
Végül az
env
segítségével aBASH_ENV
-t a.startup_script
-re állítjuk atest_env.sh
számára:$ env BASH_ENV=/home/user2/.startup_script ./test_env.sh caiman
Az
env
parancs akkor is implicit, ha megszabadulunk tőle:$ BASH_ENV=/home/user2/.startup_script ./test_env.sh caiman
Note
|
Ha nem értjük a |
Általános környezeti változók
Itt az ideje, hogy áttekintsük a legfontosabb környezeti változókat, amelyek a Bash konfigurációs fájlokban vannak beállítva!
DISPLAY
-
Az X-szerverhez kapcsolódóan ennek a változónak az értéke általában három elemből áll:
-
Az a hostnév (ennek hiányában a
localhost
), ahol az X-szerver fut. -
Egy kettőspont, mint elválasztójel.
-
Egy szám (ez általában
0
és a számítógép kijelzőjére utal).$ printenv DISPLAY :0
Ha ez a változó üres értéket kap, az X Window System nélküli szervert jelent. Egy extra szám — mint a
my.xserver:0:1
— a képernyők számára utal, ha több is van.
-
HISTCONTROL
-
Ez a változó szabályozza, hogy milyen parancsok kerüljenek elmentésre a
HISTFILE
-ba (lsd. alább). Három lehetséges érték van:ignorespace
-
A szóközzel kezdődő parancsok nem kerülnek mentésre.
ignoredups
-
Az előzővel megegyező parancs nem kerül mentésre.
ignoreboth
-
Az előző két kategória bármelyikébe tartozó parancsok nem kerülnek mentésre.
$ echo $HISTCONTROL ignoreboth
HISTSIZE
-
Ez állítja be a memóriában tárolt parancsok számát, amíg a shell munkamenet tart.
$ echo $HISTSIZE 1000
HISTFILESIZE
-
Ez állítja be a munkamenet elején és végén a
HISTFILE
-ba mentendő parancsok számát:$ echo $HISTFILESIZE 2000
HISTFILE
-
Annak a fájlnak a neve, amely az összes parancsot a beírásukkor tárolja. Alapértelmezés szerint ez a fájl a
~/.bash_history
címen található:$ echo $HISTFILE /home/user2/.bash_history
NoteA
HISTFILE
tartalmának megtekintéséhez egyszerűen írjuk be ahistory
parancsot! Alternatívaként megadhatjuk a látni kívánt parancsok számát, ha ahistory
-nak átadunk egy argumentumot (a legutóbbi parancsok számát), mint pl. ahistory 3
. HOME
-
Ez a változó az aktuális felhasználó home mappájának abszolút elérési útvonalát tárolja, és a felhasználó bejelentkezésekor kerül beállításra.
Ez a kódrészlet — a
~/.profile
-ból — magától értetődő (a `"$HOME/.bashrc"-t forrásként használja, ha létezik):# include .bashrc if it exists if [ -f "$HOME/.bashrc" ]; then . "$HOME/.bashrc" fi
NoteHa nem igazán értjük az
if
utasítást, ne aggódjunk: csak nézzük meg a shell scriptekről szóló leckéket!Ne feledjük, hogy a
~
a$HOME
megfelelője:$ echo ~; echo $HOME /home/carol /home/carol
NoteA parancsokat pontosvesszővel lehet összekapcsolni (
;
).Ezt egy
if
utasítással is bizonyíthatjuk:$ if [ ~ == "$HOME" ]; then echo "true"; else echo "false"; fi true
NoteNe feledjük: Az egyenlőségjelet
=
a változó hozzárendeléséhez használjuk. Az==
az egyenlőség tesztelésére szolgál. HOSTNAME
-
Ez a változó tárolja a host számítógép TCP/IP nevét:
$ echo $HOSTNAME debian
HOSTTYPE
-
Ez tárolja a host számítógép processzorának architektúráját:
$ echo $HOSTTYPE x86_64
LANG
-
Ez a változó tárolja a rendszer nyelvi beállításait:
$ echo $LANG en_UK.UTF-8
LD_LIBRARY_PATH
-
Ez a változó azon mappák kettősponttal elválasztott halmazából áll, amelyekben a megosztott mappákat a programok megosztják:
$ echo $LD_LIBRARY_PATH /usr/local/lib
MAIL
-
Ez a változó tárolja azt a fájlt, amelyben a Bash az e-maileket keresi:
$ echo $MAIL /var/mail/carol
Egy másik gyakori értéke ennek a változónak a következő:
/var/spool/mail/$USER
. MAILCHECK
-
Ez a változó egy numerikus értéket tárol, amely másodpercekben jelzi, hogy a Bash milyen gyakran ellenőrzi az új levelek érkezését:
$ echo $MAILCHECK 60
PATH
-
Ez a környezeti változó tárolja azoknak a mappáknak a listáját, ahol a Bash futtatható fájlokat keres, amikor bármilyen program futtatása a feladat. A mi példagépünkön ez a változó a rendszerszintű
/etc/profile
fájlon keresztül van beállítva:if [ "`id -u`" -eq 0 ]; then PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" else PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games" fi export PATH
Az
if
utasítással a felhasználó identitását teszteljük, és — a teszt eredményétől függően (root
vagy más) — megkapjuk az egyikPATH
-t vagy a másikat. Végül a kiválasztottPATH
-t azexport
segítségével továbbítjuk.Két dolgot figyeljünk meg a
PATH
értékével kapcsolatban:-
A mappanevek abszolút elérési utak használatával íródnak.
-
A kettőspont elválasztójelként van használva.
Ha a normál felhasználók számára a
/usr/local/sbin
mappát aPATH
-ban szeretnénk elhelyezni, akkor módosítjuk a sort, hogy így nézzen ki:(...) else PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/usr/local/sbin" fi export PATH
Most láthatjuk, hogyan változik a változó értéke, ha normál felhasználóként jelentkezünk be:
# su - carol $ echo $PATH /usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/usr/local/sbin
NoteHozzáadhattuk volna a
/usr/local/sbin
stringet is a felhasználóPATH
-jához a parancssorban aPATH=/usr/local/sbin:$PATH
vagy aPATH=$PATH:/usr/local/sbin
beírásával — az előbbi, ami a/usr/local/sbin
-t teszi az első mappának, amelyben futtatható fájlokat kell keresni; az utóbbi az utolsót.
-
PS1
-
Ez a változó tárolja a Bash prompt értékét. A következő kódrészletben (szintén az
/etc/profile
-ból) azif
utasítás teszteli a felhasználó személyazonosságát, és ennek megfelelően egy nagyon diszkrét promptot határoz meg (#
root
, vagy$
normál felhasználók esetén):if [ "`id -u`" -eq 0 ]; then PS1='# ' else PS1='$ ' fi
NoteA
root
id
-ja0
. Váltsunk aroot
felhasználóra és teszteljük azid -u
segítségével!További prompt változók például:
PS2
-
Általában
>
-re van állítva, és hosszú, többsoros parancsok folytatásaként használják. PS3
-
A
select
parancs promptjaként használják. PS4
-
Általában
+
-ra van állítva, és hibakeresésre használják.
SHELL
-
Ez a változó az aktuális shell abszolút útvonalát tárolja:
$ echo $SHELL /bin/bash
USER
-
Ez tárolja az aktuális felhasználó nevét:
$ echo $USER carol
Gyakorló feladatok
-
Figyeljük meg a változóhozzárendelést a “Parancs(ok)” oszlopban és jelezzük, hogy a kapott változó “Local” (lokális) vagy “Global” (globális):
Parancs(ok) Local Global debian=mother
ubuntu=deb-based
mint=ubuntu-based; export mint
export suse=rpm-based
zorin=ubuntu-based
-
Figyeljük meg a “Parancs” és a “Kimenet” oszlopokat és magyarázzuk el a jelentésüket:
Parancs Kimenet Jelentés echo $HISTCONTROL
ignoreboth
echo ~
/home/carol
echo $DISPLAY
reptilium:0:2
echo $MAILCHECK
60
echo $HISTFILE
/home/carol/.bash_history
-
A “Hibás parancs” oszlopban helytelenül vannak beállítva a változók. Adjuk meg a hiányzó információkat a “Helyes parancs” és “Változóhivatkozás” oszlopokban, hogy az eredmény a “Várható kimenet” értéke legyen:
Hibás parancs Helyes parancs Változóhivatkozás Várható kimenet lizard =chameleon
chameleon
cool lizard=chameleon
chameleon
lizard=cha|me|leon
cha|me|leon
lizard=/** chameleon **/
/** chamelon **/
win_path=C:\path\to\dir\
C:\path\to\dir\
-
Nézzük meg a célt és írjuk be a megfelelő parancsot:
Cél Parancs Az aktuális shell nyelvének beállítása spanyol UTF-8-ra (
es_ES.UTF-8
).Az aktuális mappa nevének kiírása.
Hivatkozás az
ssh
kapcsolatokról szóló információkat tároló környezeti változóra.A
PATH
beállítása, hogy a/home/carol/scripts
legyen az utolsó mappa, amelyben futtatható fájlokat keres.A
my_path
értékének beállítása aPATH
-ra.A
my_path
értékének beállítása az adottPATH
értékére. -
Hozzunk létre egy lokális változót
mammal
néven és legyen az értékegnu
: -
A változóhelyettesítés segítségével hozzunk létre egy másik helyi változót
var_sub
néven a megfelelő értékkel, hogy amikor aecho $var_sub
segítségével hivatkozunk rá, a következőt kapjuk:The value of mammal is gnu
: -
Alakítsuk a
mammal
-t környezeti változóvá: -
Keressük meg a
set
és agrep
segítségével: -
Keressük meg az
env
és agrep
segítségével: -
Hozzunk létre két egymást követő parancsban egy
BIRD
nevű környezeti változót, amelynek értékepenguin
: -
Hozzunk létre egyetlen paranccsal egy
NEW_BIRD
nevű környezeti változót, amelynek értékeyellow-eyed pengiun
: -
Tételezzük fel, hogy mi vagyunk a
user2
felhasználó, hozzunk létre egybin
mappát a home mappánk alatt: -
Írjuk be a parancsot ami
~/bin
mappát hozzáadja aPATH-hoz
úgy, hogy ez legyen az első mappa, amelyben abash
binárisokat keres: -
Annak garantálására, hogy a
PATH
értéke változatlan maradjon az újraindítások során, milyen kódrészletet - egyif
utasítás formájában - tehetnénk a~/.profile
-ba?
Gondolkodtató feladatok
-
let
: több mint aritmetikai kifejezés kiértékelése:-
Keressünk rá a manpage-ben vagy az interneten a
let
-re és annak hatására a változók beállításakor, és hozzunk létre egy új helyi változótmy_val
néven, amelynek értéke10
— az 5 és 5 hozzáadásának eredményeként: -
Most hozzunk létre egy másik változót
your_val
néven, aminek az értéke5
— amy_val
értékének 2-vel történő osztásának eredményeként:
-
-
Egy parancs eredménye egy változóban? Természetesen lehetséges; ezt hívják parancshelyettesítésnek (command substitution). Vizsgáljuk meg, és tanulmányozzuk a következő
music_info
nevű függvényt:music_info(){ latest_music=`ls -l1t ~/Music | head -n 6` echo -e "Your latest 5 music files:\n$latest_music" }
Az
ls -l1t ~/Music | head -n 6
parancs eredménye lesz alatest_music
változó értéke. Ezután alatest_music
változóra hivatkozik aecho
parancs (amely kiadja aMusic
mappa által elfoglalt összes bájt számát és aMusic
mappában tárolt legutóbbi öt zenefájlt — soronként egyet).Az alábbiak közül melyik érvényes szinonimája a következőknek
latest_music=`ls -l1t ~/Music | head -n 6`
A lehetőség:
latest_music=$(ls -l1t ~/Music| head -n 6)
B lehetőség:
latest_music="(ls -l1t ~/Music| head -n 6)"
C lehetőség:
latest_music=((ls -l1t ~/Music| head -n 6))
Összefoglalás
Ebben a leckében megtanultuk:
-
A változók nagyon fontos részét képezik a shell környezetének, mivel maga a shell és más programok is használják őket.
-
Hogyan rendelhetünk hozzá és hivatkozhatunk változókra.
-
A local (lokális) és global (globális) (vagy environment (környezeti)) változók közötti különbségek.
-
Hogyan tegyük a változókat readonly-vá.
-
Hogyan lehet egy helyi változót környezeti változóvá alakítani az
export
paranccsal. -
Hogyan lehet felsorolni az összes környezeti változót.
-
Hogyan futtassunk egy programot módosított környezetben.
-
Hogyan lehet a változókat állandóvá tenni a startup scriptek segítségével.
-
Néhány gyakori környezeti változó:
DISPLAY
,HISTCONTROL
,HISTSIZE
,HISTFILESIZE
,HISTFILE
,HOME
,HOSTNAME
,HOSTTYPE
,LANG
,LD_LIBRARY_PATH
,MAIL
,MAILCHECK
,PATH
,PS1
(és más prompt változók),SHELL
ésUSER
. -
A tilde (
~
) jelentése. -
Az
if
utasítások alapjai.
A leckében használt parancsok:
echo
-
Hivatkozás egy változóra.
ls
-
Mappa tartalmának listázása.
readonly
-
Változók megváltoztathatatlanná tétele. Az aktuális munkamenet összes olvasható változójának listázása.
set
-
Az aktuális munkamenet összes változójának és függvényének listázása.
grep
-
Mintának megfelelő sorok nyomtatása.
bash
-
Új shell indítása
unset
-
Változók visszavonása.
export
-
Egy helyi változót környezeti változóvá alakít. Környezeti változók listázása.
env
-
Környezeti változók listázása. Program futtatása módosított környezetben.
printenv
-
Környezeti változók listázása. Hivatkozás egy változóra.
chmod
-
Egy fájl üzemmódbitjeinek módosítása, például futtathatóvá tétele.
history
-
Előzőleg használt parancsok listázása.
su
-
Felhasználói azonosító módosítása vagy szuperfelhasználóvá válás.
id
-
Felhasználói ID kiíratása.
Válaszok a gyakorló feladatokra
-
Figyeljük meg a változóhozzárendelést a “Parancs(ok)” oszlopban és jelezzük, hogy a kapott változó “Local” (lokális) vagy “Global” (globális):
Parancs(ok) Local Global debian=mother
Igen
Nem
ubuntu=deb-based
Igen
Nem
mint=ubuntu-based; export mint
Nem
Igen
export suse=rpm-based
Nem
Igen
zorin=ubuntu-based
Igen
Nem
-
Figyeljük meg a “Parancs” és a “Kimenet” oszlopokat és magyarázzuk el a jelentésüket:
Parancs Kimenet Jelentés echo $HISTCONTROL
ignoreboth
A duplikált és a szóközzel kezdődő parancsok nem kerülnek elmentésre a
history
-ba.echo ~
/home/carol
A
HOME
mappájacarol
-nak/home/carol
.echo $DISPLAY
reptilium:0:2
A
reptilium
gépen fut egy X szerver, és a kijelző második képernyőjét használjuk.echo $MAILCHECK
60
A levelezés minden percben ellenőrzésre kerül.
echo $HISTFILE
/home/carol/.bash_history
A
history
a/home/carol/.bash_history
-ban kerül mentésre. -
A “Hibás parancs” oszlopban helytelenül vannak beállítva a változók. Adjuk meg a hiányzó információkat a “Helyes parancs” és “Változóhivatkozás” oszlopokban, hogy az eredmény a “Várható kimenet” értéke legyen:
Hibás parancs Helyes parancs Változóhivatkozás Várható kimenet lizard =chameleon
lizard=chameleon
echo $lizard
chameleon
cool lizard=chameleon
cool_lizard=chameleon
(for example)echo $cool_lizard
chameleon
lizard=cha|me|leon
lizard="cha|me|leon"
orlizard='cha|me|leon'
echo $lizard
cha|me|leon
lizard=/** chameleon **/
lizard="/** chameleon **/"
orlizard='/** chameleon **/'
echo "$lizard"
/** chamelon **/
win_path=C:\path\to\dir\
win_path=C:\\path\\to\\dir\\
echo $win_path
C:\path\to\dir\
-
Nézzük meg a célt és írjuk be a megfelelő parancsot:
Cél Parancs Az aktuális shell nyelvének beállítása spanyol UTF-8-ra (
es_ES.UTF-8
).LANG=es_ES.UTF-8
Az aktuális mappa nevének kiírása
echo $PWD
orpwd
Hivatkozás az
ssh
kapcsolatokról szóló információkat tároló környezeti változóra.echo $SSH_CONNECTION
A
PATH
beállítása, hogy a/home/carol/scripts
legyen az utolsó mappa, amelyben futtatható fájlokat keres.PATH=$PATH:/home/carol/scripts
A
my_path
értékének beállítása aPATH
-ra.my_path=PATH
A
my_path
értékének beállítása az adottPATH
értékére.my_path=$PATH
-
Hozzunk létre egy lokális változót
mammal
néven és legyen az értékegnu
:mammal=gnu
-
A változóhelyettesítés segítségével hozzunk létre egy másik helyi változót
var_sub
néven a megfelelő értékkel, hogy amikor aecho $var_sub
segítségével hivatkozunk rá, a következőt kapjuk:The value of mammal is gnu
:var_sub="The value of mammal is $mammal"
-
Alakítsuk a
mammal
-t környezeti változóvá:export mammal
-
Keressük meg a
set
és agrep
segítségével:set | grep mammal
-
Keressük meg a
set
és agrep
segítségével:env | grep mammal
-
Hozzunk létre két egymást követő parancsban egy
BIRD
nevű környezeti változót, amelynek értékepenguin
:BIRD=penguin; export BIRD
-
Hozzunk létre egyetlen paranccsal egy
NEW_BIRD
nevű környezeti változót, amelynek értékeyellow-eyed pengiun
:export NEW_BIRD="yellow-eyed penguin"
or
export NEW_BIRD='yellow-eyed penguin'
-
Tételezzük fel, hogy mi vagyunk az
user2
felhasználó, hozzunk létre egybin
mappát a home mappánk alatt:mkdir ~/bin
vagy
mkdir /home/user2/bin
vagy
mkdir $HOME/bin
-
Írjuk be a parancsot ami
~/bin
mappát hozzáadja aPATH-hoz
úgy, hogy ez legyen az első mappa, amelyben abash
binárisokat keres:PATH="$HOME/bin:$PATH"
A
PATH=~/bin:$PATH
vagy aPATH=/home/user2/bin:$PATH
egyformán helyesek. -
Annak garantálására, hogy a
PATH
értéke változatlan maradjon az újraindítások során, milyen kódrészletet - egyif
utasítás formájában - tehetnénk a~/.profile
-ba?if [ -d "$HOME/bin" ] ; then PATH="$HOME/bin:$PATH" fi
Válaszok a gondolkodtató feladatokra
-
let
: több mint aritmetikai kifejezés kiértékelése:-
Keressünk rá a manpage-ben vagy az interneten a
let
-re és annak hatására a változók beállításakor, és hozzunk létre egy új helyi változótmy_val
néven, amelynek értéke10
— az 5 és 5 hozzáadásának eredményeként:let "my_val = 5 + 5"
vagy
let 'my_val = 5 + 5'
-
Most hozzunk létre egy másik változót
your_val
néven, aminek az értéke5
— amy_val
értékének 2-vel történő osztásának eredményeként:let "your_val = $my_val / 2"
vagy
let 'your_val = $my_val / 2'
-
-
Egy parancs eredménye egy változóban? Természetesen lehetséges; ezt hívják parancshelyettesítésnek (command substitution). Vizsgáljuk meg, és tanulmányozzuk a következő
music_info
nevű függvényt:music_info(){ latest_music=`ls -l1t ~/Music | head -n 6` echo -e "Your latest 5 music files:\n$latest_music" }
Az
ls -l1t ~/Music | head -n 6
parancs eredménye lesz alatest_music
változó értéke. Ezután alatest_music
változóra hivatkozik aecho
parancs (amely kiadja aMusic
mappa által elfoglalt összes bájt számát és aMusic
mappában tárolt legutóbbi öt zenefájlt — soronként egyet).Az alábbiak közül melyik érvényes szinonimája a következőknek
latest_music=`ls -l1t ~/Music | head -n 6`
Az A lehetőség:
latest_music=$(ls -l1t ~/Music| head -n 6)