For å mestre Bash-skallet på Linux, macOS eller andre UNIX-lignende systemer, er det essensielt å forstå spesialtegn som ~, *, | og >. Vi skal her hjelpe deg med å dechiffrere disse kryptiske Linux-kommandoene og gjøre deg til en mester i bruken av disse.
Hva er spesialtegn?
Spesialtegn er et sett av symboler som Bash-skallet behandler på en unik måte. Når du skriver dem i skallet, fungerer de som instruksjoner eller kommandoer, og signaliserer til skallet å utføre en spesifikk handling. Man kan betrakte dem som kommandoer bestående av et enkelt tegn.
Noen ganger ønsker man imidlertid bare å skrive ut selve tegnet, uten at det skal fungere som et magisk symbol. Det finnes en måte å bruke et tegn for å representere seg selv, i stedet for dets spesielle funksjon.
Vi vil demonstrere hvilke tegn som er «spesielle» eller «meta»-tegn, og hvordan du kan bruke dem både funksjonelt og bokstavelig.
~ Hjemmekatalog
Tilde (~) er en forkortelse for din hjemmekatalog. Dette betyr at du slipper å skrive inn hele stien til hjemmekatalogen din i kommandoer. Uansett hvor du befinner deg i filsystemet, kan du bruke denne kommandoen for å navigere til hjemmekatalogen din:
cd ~
Du kan også bruke tilde med relative stier. Hvis du for eksempel er et sted i filsystemet som ikke er under hjemmekatalogen din og ønsker å gå til arkivkatalogen i arbeidskatalogen din, kan du bruke tilde slik:
cd ~/work/archive
. Gjeldende katalog
Et enkelt punktum (.) representerer gjeldende katalog. Du ser dette i katalogoppføringer hvis du bruker alternativet -a (alle) med kommandoen ls.
ls -a
Du kan også bruke punktum i kommandoer for å angi stien til gjeldende katalog. For eksempel, hvis du vil kjøre et skript fra gjeldende katalog, vil du kalle det slik:
./script.sh
Dette forteller Bash å lete i gjeldende katalog etter filen script.sh. På denne måten vil den ikke søke i katalogene i PATH-variabelen din etter en samsvarende kjørbar fil eller skript.
.. Overordnet katalog
De doble punktumene (..) representerer den overordnede katalogen til din nåværende. Du kan bruke dette for å gå et nivå opp i katalogtreet.
cd ..
Du kan også bruke denne kommandoen med relative stier – for eksempel hvis du ønsker å gå et nivå opp i katalogtreet og deretter inn i en annen katalog på det nivået.
Du kan også bruke denne teknikken til raskt å navigere til en katalog på samme nivå som din nåværende. Du hopper først et nivå opp og deretter ned til en annen katalog.
cd ../gc_help
/ Stiskille for katalog
Du kan bruke en skråstrek (/) – ofte bare kalt en «slash» – for å skille katalogene i en sti.
ls ~/work/archive
En enkelt skråstrek representerer den kortest mulige katalogstien. Siden alt i Linux-katalogtreet starter fra rotkatalogen, kan du bruke denne kommandoen for raskt å navigere til rotkatalogen:
cd /
# Kommentar eller strengtrimming
Vanligvis brukes hashtag eller nummertegnet (#) for å indikere at det som følger er en kommentar, og skallet skal ignorere det. Du kan bruke det i shell-skript og – noe mindre praktisk – på kommandolinjen.
# Dette vil bli ignorert av Bash-skallet
Det ignoreres likevel ikke helt, ettersom det blir lagt til i kommandohistorikken din.
Du kan også bruke hashtag for å trimme en strengvariabel og fjerne tekst fra begynnelsen. Denne kommandoen oppretter en strengvariabel kalt `this_string`.
I dette eksemplet tildeler vi teksten «Dave Geek!» til variabelen.
this_string="Dave Geek!"
Denne kommandoen bruker echo for å skrive ut ordene «How-To» i terminalvinduet. Den henter verdien som er lagret i strengvariabelen via en parameterutvidelse. Fordi vi legger til hashtag og teksten «Dave», trimmer den av den delen av strengen før den sendes til echo.
echo How-To ${this_string#Dave}
Dette endrer ikke verdien som er lagret i strengvariabelen; det påvirker bare det som sendes til echo. Vi kan bruke echo for å skrive ut verdien til strengvariabelen igjen for å bekrefte dette:
echo $this_string
? Jokertegn for enkelttegn
Bash-skallet støtter tre jokertegn, hvorav ett er spørsmålstegnet (?). Du bruker jokertegn for å erstatte tegn i filnavnsmønstre. Et filnavn som inneholder et jokertegn danner et mønster som kan samsvare med flere filnavn, istedenfor bare ett.
Jokertegnet for spørsmålstegnet representerer nøyaktig ett tegn. Tenk på følgende filnavnsmønster:
ls badge?.txt
Dette betyr «vis en liste over alle filer med et navn som begynner med «badge» og etterfølges av et enkelt tegn, før filtypen».
Dette vil matche følgende filer. Legg merke til at noen filer har tall og noen har bokstaver etter «badge»-delen av filnavnet. Spørsmålstegnet vil samsvare med både bokstaver og tall.
Imidlertid vil ikke filnavnsmønsteret matche «badge.txt», fordi filnavnet ikke har et enkelt tegn mellom «badge» og filtypen. Jokertegnet for spørsmålstegnet må samsvare med et tilsvarende tegn i filnavnet.
Du kan også bruke spørsmålstegnet for å finne alle filer med et bestemt antall tegn i filnavnet. Dette viser alle tekstfiler som har nøyaktig fem tegn i filnavnet:
ls ?????.txt
* Jokertegn for tegnsekvens
Du kan bruke stjernen (*), som er et jokertegn for å representere en hvilken som helst sekvens av tegn, inkludert ingen tegn. Tenk på følgende filnavnsmønster:
ls badge*
Dette vil matche alle filer som starter med «badge», uansett hva som følger etter.
Det vil også matche «badge.txt» fordi jokertegnet representerer en hvilken som helst sekvens av tegn eller ingen tegn.
ls source.*
[] Jokertegn for tegnsett
Som nevnt over, bruker du spørsmålstegnet for å representere et enkelt tegn, og stjernen for å representere en hvilken som helst sekvens av tegn (inkludert ingen tegn). Med hakeparenteser ([ ]) kan du lage et jokertegn med de tegnene som er inkludert i parentesene. Det relevante tegnet i filnavnet må da samsvare med minst ett av tegnene i jokertegnsettet.
ls badge_0[246].txt
Dette vil matche filer som badge_02.txt, badge_04.txt og badge_06.txt.
ls badge_[01][789].txt
Dette vil matche filer som badge_07.txt, badge_08.txt, badge_09.txt, badge_17.txt, badge_18.txt og badge_19.txt.
ls badge_[23][1-5].txt
; Kommando skilletegn
Du kan skrive så mange kommandoer du ønsker på kommandolinjen, så lenge du skiller hver av dem med et semikolon (;).
ls > count.txt; wc -l count.txt; rm count.txt
Merk at den andre kommandoen kjører selv om den første feiler, den tredje kjører selv om den andre feiler, og så videre.
cd ./doesntexist && cp ~/Documents/reports/* .
& Bakgrunnsprosess
Etter at du har skrevet inn en kommando i et terminalvindu og den er ferdig, kommer du tilbake til ledeteksten. Normalt tar dette bare et øyeblikk eller to. Men hvis du starter et annet program, for eksempel gedit, kan du ikke bruke terminalvinduet før du lukker programmet.
gedit command_address.page &
Bash viser deg prosess-ID-en for det som ble lansert, og returnerer deg deretter til kommandolinjen. Du kan fortsette å bruke terminalvinduet.
sort < words.txt
Når en kommando har inndata omdirigert til seg, kan den oppføre seg annerledes enn når den leser fra en fil.
Hvis vi bruker wc for å telle ord, linjer og tegn i en fil, skriver den ut verdiene og deretter filnavnet. Hvis vi omdirigerer innholdet i filen til wc, skriver den ut de samme numeriske verdiene, men vet ikke navnet på filen som dataene kom fra. Den kan ikke skrive ut filnavnet.
Her er noen eksempler på hvordan du kan bruke wc:
wc words.txt
wc < words.txt
> Utdata omdirigering
Du kan bruke høyre vinkelparentes (>) for å omdirigere utdata fra en kommando (vanligvis til en fil); her er et eksempel:
ls > files.txt
cat files.txt
wc doesntexist.txt 2> errors.txt
cat errors.txt
| Rør
Et «rør» kobler sammen kommandoer. Den tar utdata fra en kommando og mater den inn i den neste som input. Antall kommandoer (lengden på kjeden) er vilkårlig.
Her bruker vi cat for å mate innholdet i filen words.txt inn i grep, som trekker ut alle linjer som inneholder enten en liten eller stor «C». grep vil deretter sende disse linjene til sort. sort bruker alternativet -r (omvendt), så de sorterte resultatene vises i omvendt rekkefølge.
cat words.txt | grep [cC] | sort -r
! Logisk NOT og Historieoperator
Utropstegnet (!) er en logisk operator som betyr IKKE.
[ ! -d ./backup ] && mkdir ./backup
Det er to kommandoer i denne kommandolinjen:
Den første kommandoen er teksten innenfor hakeparentesene;
Den andre kommandoen er teksten som følger de doble og-tegnene &&.
Den første kommandoen bruker ! som en logisk operator. De firkantede parentesene indikerer at en test skal utføres. Alternativet -d (katalog) tester for tilstedeværelsen av en katalog kalt backup. Den andre kommandoen oppretter katalogen.
Siden doble og-tegn skiller de to kommandoene, vil Bash bare utføre den andre hvis den første lykkes. Det er imidlertid det motsatte av det vi trenger. Hvis testen for «backup»-katalogen lykkes, trenger vi ikke å opprette den. Og hvis testen for «backup»-katalogen mislykkes, vil ikke den andre kommandoen utføres, og den manglende katalogen vil ikke opprettes.
Det er her den logiske operatoren ! kommer inn. Det fungerer som et logisk IKKE. Så hvis testen lykkes (dvs. katalogen eksisterer), vil ! snu det til «IKKE suksess», som er fiasko. Så den andre kommandoen aktiveres ikke.
Hvis katalogtesten mislykkes (dvs. katalogen eksisterer ikke), vil ! endre svaret til «IKKE fiasko», som er suksess. Så kommandoen for å opprette den manglende katalogen utføres.
Det lille ! tegnet gir mye kraft når du trenger det!
ls -l -d backup
!24
Følgende kjører forrige kommando på nytt:
!!
$ Variabeluttrykk
I Bash-skallet oppretter du variabler for å holde verdier. Noen, som miljøvariabler, eksisterer alltid, og du kan få tilgang til dem hver gang du åpner et terminalvindu. Disse inneholder verdier som brukernavn, hjemmekatalog og PATH.
echo $USER
echo $HOME
echo $PATH
ThisDistro=Ubuntu
MyNumber=2001
echo $ThisDistro
echo $MyNumber
Legg til klammeparenteser ({}) rundt dollartegnet og utfør en parameterutvidelse for å få verdien til variabelen og tillate ytterligere transformasjoner av verdien.
MyString=123456qwerty
Dette oppretter en variabel som inneholder en streng av tegn:
echo ${MyString}
Bruk følgende kommando for å echo strengen til terminalvinduet:
echo ${myString:6}
For å returnere delstrengen fra posisjon 6 i hele strengen, bruk følgende kommando (det er en nullforskyvning, så den første posisjonen er null):
echo ${myString:0:6}
Hvis du vil echo en delstreng som starter på posisjon null og inneholder de neste seks tegnene, bruk følgende kommando:
echo ${myString:4:4}
Sitering av spesialtegn
Hvis du vil bruke et spesialtegn som et bokstavelig (ikke-spesielt) tegn, må du informere Bash-skallet om det. Dette kalles sitering, og det er tre måter å gjøre det på.
Hvis du setter tekst i doble anførselstegn («…»), hindrer dette Bash i å handle på de fleste spesialtegnene, og de vil bare skrives ut. Et bemerkelsesverdig unntak er imidlertid dollartegnet ($). Det fungerer fortsatt som tegnet for variabeluttrykk, slik at du kan inkludere verdiene fra variabler i utdataene dine.
echo "Today is $(date)"
For eksempel skriver denne kommandoen ut dato og klokkeslett:
echo 'Today is $(date)'
Hvis du omslutter teksten i enkle anførselstegn («…») som vist nedenfor, stopper dette funksjonen til alle spesialtegnene:
echo "Today is $(date)"
Du kan bruke en omvendt skråstrek (\) for å forhindre at det følgende tegnet fungerer som et spesialtegn. Dette kalles å «escape» karakteren; se eksemplet nedenfor:
Se på spesialtegn som veldig korte kommandoer. Å forstå bruken av dem kan være til stor nytte for din forståelse av Bash-skallet – og andres skript