15 specialtecken du behöver känna till för Bash

Om du vill behärska Bash-skalet på Linux, macOS eller något annat UNIX-liknande system är specialtecken (som ~, *, | och >) avgörande. Vi hjälper dig att reda ut dessa kryptiska Linux-kommandosekvenser och bli en hjälte av hieroglyfer.

Vad är specialtecken?

Det finns en uppsättning tecken Bash skal behandlar på två olika sätt. När du skriver dem på skalet fungerar de som instruktioner eller kommandon och säger åt skalet att utföra en viss funktion. Se dem som kommandon med ett tecken.

Ibland vill du bara skriva ut en karaktär och behöver den inte för att fungera som en magisk symbol. Det finns ett sätt att använda en karaktär för att representera sig själv snarare än dess speciella funktion.

Vi visar dig vilka karaktärer som är ”speciella” eller ”meta-” karaktärer, samt hur du kan använda dem funktionellt och bokstavligt.

~ Hemkatalog

Tilden (~) är en förkortning för din hemkatalog. Det betyder att du inte behöver skriva hela sökvägen till din hemkatalog i kommandon. Var du än befinner dig i filsystemet kan du använda det här kommandot för att gå till din hemkatalog:

cd ~

De

Du kan också använda det här kommandot med relativa sökvägar. Till exempel, om du är någonstans i filsystemet som inte finns under din hemmapp och vill byta till arkivkatalogen i din arbetskatalog, använd tilde för att göra det:

cd ~/work/archive

De

. Aktuell katalog

En punkt (.) representerar den aktuella katalogen. Du ser det i kataloglistor om du använder alternativet -a (alla) med ls.

ls -a

De

Du kan också använda punkten i kommandon för att representera sökvägen till din nuvarande katalog. Till exempel, om du vill köra ett skript från den aktuella katalogen, skulle du kalla det så här:

./script.sh

Detta säger till Bash att leta efter filen script.sh i den aktuella katalogen. På så sätt kommer den inte att söka i katalogerna på din väg efter matchande körbar fil eller skript.

De

.. Föräldrakatalog

Den dubbla punkten eller ”dubbelpunkten” (..) representerar den överordnade katalogen för din nuvarande. Du kan använda detta för att flytta upp en nivå i katalogträdet.

cd ..

De

Du kan också använda det här kommandot med relativa sökvägar – till exempel om du vill gå upp en nivå i katalogträdet och sedan ange en annan katalog på den nivån.

Du kan också använda den här tekniken för att snabbt flytta till en katalog på samma nivå i katalogträdet som din nuvarande. Du hoppar upp en nivå och backar sedan ner en till en annan katalog.

cd ../gc_help

De

/ Path Directory Separator

Du kan använda ett snedstreck (/) – ofta bara kallat ett snedstreck – för att separera katalogerna i ett sökvägsnamn.

ls ~/work/archive

De

Ett snedstreck framåt representerar den kortaste möjliga katalogsökvägen. Eftersom allt i Linux-katalogträdet börjar i rotkatalogen, kan du använda det här kommandot för att snabbt flytta till rotkatalogen:

cd /

De

# Kommentar eller trimma strängar

Oftast använder du hashen eller siffertecknet (#) för att tala om för skalet att det som följer är en kommentar, och det ska inte agera på det. Du kan använda det i skalskript och – mindre användbart – på kommandoraden.

# This will be ignored by the Bash shell

De

Det ignoreras inte riktigt, eftersom det har lagts till i din kommandohistorik.

Du kan också använda hashen för att trimma en strängvariabel och ta bort lite text från början. Detta kommando skapar en strängvariabel som heter this_string.

I det här exemplet tilldelar vi texten ”Dave Geek!” till variabeln.

this_string="Dave Geek!"

Detta kommando använder eko för att skriva ut orden ”Hur-gör” till terminalfönstret. Den hämtar värdet lagrat i strängvariabeln via a parameterexpansion. Eftersom vi lägger till hashen och texten ”Dave”, klipper den bort den delen av strängen innan den skickas till eko.

echo How-To ${this_string#Dave}

En

Detta ändrar inte värdet som lagras i strängvariabeln; det påverkar bara det som skickas till eko. Vi kan använda echo för att skriva ut värdet på strängvariabeln en gång till och kontrollera detta:

echo $this_string

De

? Jokertecken för enstaka tecken

Bash-skalet stöder tre jokertecken, varav ett är frågetecknet (?). Du använder jokertecken för att ersätta tecken i filnamnsmallar. Ett filnamn som innehåller ett jokertecken bildar en mall som matchar en rad filnamn, snarare än bara ett.

Frågetecknet jokertecken representerar exakt ett tecken. Tänk på följande filnamnsmall:

ls badge?.txt

Detta översätts som ”lista vilken fil som helst med ett namn som börjar med ”märke” och följs av ett enda tecken före filnamnstillägget.”

Det matchar följande filer. Observera att vissa har siffror och vissa har bokstäver efter ”badge”-delen av filnamnet. Frågetecknets jokertecken matchar både bokstäver och siffror.

De

Den filnamnsmallen matchar dock inte ”badge.txt”, eftersom filnamnet inte har ett enda tecken mellan ”badge” och filtillägget. Jokertecken från frågetecknet måste matcha ett motsvarande tecken i filnamnet.

Du kan också använda frågetecknet för att hitta alla filer med ett visst antal tecken i filnamnen. Detta listar alla textfiler som innehåller exakt fem tecken i filnamnet:

ls ?????.txt

A

* Jokertecken för teckensekvens

Du kan använda asterisken

ls badge*

jokertecken som står för en sekvens av tecken, inklusive inga tecken. Tänk på följande filnamnsmall:

Detta matchar alla följande:

En

Det matchar ”badge.txt” eftersom jokertecknet representerar en sekvens av tecken eller inga tecken.

ls source.*

Detta kommando matchar alla filer som kallas

[] En

Teckenuppsättning jokertecken

Som beskrivits ovan använder du frågetecknet för att representera ett enstaka tecken och asterisken för att representera vilken sekvens av tecken som helst (inklusive inga tecken). [] Du kan skapa ett jokertecken med hakparenteser (

) och de tecken de innehåller. Det relevanta tecknet i filnamnet måste då matcha minst ett av tecknen i jokerteckenuppsättningen.

ls badge_0[246].txt

I det här exemplet översätts kommandot till:

En

ls badge_[01][789].txt

Du kan använda mer än en uppsättning parenteser per filnamnsmall:

En

ls badge_[23][1-5].txt

Du kan också inkludera intervall i teckenuppsättningen.  Följande kommando väljer filer med siffrorna 21 till 25 och 31 till 35 i filnamnet.

En

; Shell Command Separator

ls > count.txt; wc -l count.txt; rm count.txt

Du kan skriva hur många kommandon du vill på kommandoraden, så länge du separerar vart och ett av dem med ett semikolon (;).  Vi gör detta i följande exempel: En

count.txt; wc -l count.txt; rm count.txt” kommando i ett terminalfönster’ width=”646″ height=”122″ onload=”pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);” onerror=”this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”>

Observera att det andra kommandot körs även om det första misslyckas, det tredje körs även om det andra misslyckas, och så vidare.

cd ./doesntexist && cp ~/Documents/reports/* .

Om du vill stoppa exekveringen om ett kommando misslyckas, använd ett dubbelt et-tecken (&&) istället för ett semikolon:

A

& Bakgrundsprocess

När du har skrivit ett kommando i ett terminalfönster och det är klart, återgår du till kommandotolken. Normalt tar detta bara ett ögonblick eller två. Men om du startar ett annat program, till exempel gedit, kan du inte använda ditt terminalfönster förrän du stänger programmet.

gedit command_address.page &

Du kan dock starta ett program som en bakgrundsprocess och fortsätta att använda terminalfönstret.  För att göra detta, lägg bara till ett et-tecken på kommandoraden:

A

Bash visar dig process-ID för det som lanserades och återgår sedan till kommandoraden. Du kan sedan fortsätta att använda ditt terminalfönster.

sort 

Många Linux-kommandon accepterar en fil som en parameter och tar deras data från den filen.  De flesta av dessa kommandon kan också ta input från en ström.  För att skapa en ström använder du den vänstra vinkelparentesen (

When a command has input redirected into it, it might behave differently than when it reads from a named file.

If we use wc to count the words, lines, and characters in a file, it prints the values, and then the filename. If we redirect the contents of the file to wc, it prints the same numeric values but doesn’t know the name of the file from which the data came. It cannot print a filename.

Here are some examples of how you can use wc:

wc words.txt
wc 

A

> Output Redirection

You can use the right-angle bracket ( > ) to redirect the output from a command (typically, into a file); here’s an example:

ls > files.txt
cat files.txt

A En

files.txt" kommandot i ett terminalfönster." width="646" height="382" >

wc doesntexist.txt 2> errors.txt
cat errors.txt

Utdataomdirigering kan också omdirigera felmeddelanden om du använder en siffra (2, i vårt exempel) med >.  Så här gör du: A

errors.txt" kommandot i ett terminalfönster." width="646" height="122" >

| Rör

Ett "rör" kedjer kommandon tillsammans. Det tar utdata från ett kommando och matar det till nästa som input. Antalet kommandon (längden på kedjan) är godtyckligt.

Här kommer vi att använda cat för att mata in innehållet i words.txt-filen till grep, som extraherar alla rader som innehåller antingen ett gement eller stort "C". grep skickar sedan dessa rader för att sortera. sortera använder alternativet -r (omvänd), så de sorterade resultaten visas i omvänd ordning.

cat words.txt | grep [cC] | sort -r

Vi skrev följande:

A

! Pipeline logisk NOT och historikoperatör

Utropstecknet (!) är en logisk operator som betyder INTE.

[ ! -d ./backup ] && mkdir ./backup

Det finns två kommandon på den här kommandoraden:
Det första kommandot är texten inom hakparenteserna;

Det andra kommandot är texten som följer dubbla et-tecken &&.

Det första kommandot använder ! som en logisk operator. De fyrkantiga parenteserna indikerar att ett test kommer att göras. Alternativet -d (katalog) testar om det finns en katalog som kallas backup. Det andra kommandot skapar katalogen.

Eftersom dubbla et-tecken skiljer de två kommandona åt, kommer Bash bara att köra det andra om det första lyckas. Det är dock motsatsen till vad vi behöver. Om testet för "backup"-katalogen lyckas behöver vi inte skapa den. Och om testet för "backup"-katalogen misslyckas, kommer det andra kommandot inte att köras, och den saknade katalogen kommer inte att skapas.

Det är här den logiska operatorn! kommer in. Det fungerar som ett logiskt NOT. Så, om testet lyckas (dvs katalogen finns), ! vänder det till "INTE framgång", vilket är misslyckande. Så det andra kommandot är inte aktiverat.

Om katalogtestet misslyckas (dvs. katalogen finns inte), visas ! ändrar svaret på "INTE misslyckande", vilket är framgång. Så kommandot för att skapa den saknade katalogen körs.

Den där lilla! ger mycket kraft när du behöver det!

ls -l -d backup

För att kontrollera statusen för säkerhetskopieringsmappen använder du kommandot ls och alternativen -l (lång lista) och -d (katalog), som visas nedan:

A

!24

Du kan också köra kommandon från din kommandohistorik med utropstecken.  History-kommandot listar din kommandohistorik och du skriver sedan in numret på kommandot du vill köra igen med!  för att utföra det, som visas nedan:

A

!!

Följande kör om det föregående kommandot:

$ Variabla uttryck I Bash-skalet skapar du variabler för att hålla värden. Vissa, liksom Miljövariabler,

finns alltid och du kan komma åt dem när du öppnar ett terminalfönster. Dessa innehåller värden, som ditt användarnamn, hemkatalog och sökväg.

echo $USER
echo $HOME
echo $PATH

Du kan använda eko för att se värdet som en variabel har – före variabelnamnet med dollartecknet ($), som visas nedan:

En

ThisDistro=Ubuntu
MyNumber=2001
echo $ThisDistro
echo $MyNumber

För att skapa en variabel måste du ge den ett namn och ange ett värde för att den ska hålla.  Du behöver inte använda dollartecknet för att skapa en variabel.  Du lägger bara till $ när du refererar till en variabel, som i följande exempel:

En

Lägg till klammerparenteser ( {} ) runt dollartecknet och utför en parameterexpansion för att få värdet på variabeln och tillåta ytterligare transformationer av värdet.

MyString=123456qwerty

Detta skapar en variabel som innehåller en sträng av tecken, som visas nedan:

echo ${MyString}

Använd följande kommando för att eka strängen till terminalfönstret:

echo ${myString:6}

För att returnera delsträngen från position 6 i hela strängen, använd följande kommando (det finns en nollförskjutning, så den första positionen är noll):

echo ${myString:0:6}

Om du vill eka en delsträng som börjar vid position noll och innehåller de nästa sex tecknen, använd följande kommando:

echo ${myString:4:4}

Använd följande kommando för att eka en delsträng som börjar vid position fyra och innehåller de nästa fyra tecknen:

A

Citerar specialtecken

Om du vill använda ett specialtecken som ett bokstavligt (icke-speciellt) tecken, måste du berätta för Bash-skalet. Detta kallas att citera, och det finns tre sätt att göra det.

Om du omger texten inom citattecken ("...") hindrar detta Bash från att agera på de flesta specialtecknen, och de skrivs bara ut. Ett anmärkningsvärt undantag är dock dollartecknet ($). Det fungerar fortfarande som tecknet för variabeluttryck, så du kan inkludera värden från variabler i din utdata.

echo "Today is $(date)"

Detta kommando skriver till exempel ut datum och tid:

echo 'Today is $(date)'

Om du lägger in texten med enkla citattecken ('...') som visas nedan, stoppar det funktionen för alla specialtecken:

echo "Today is $(date)"

Du kan använda ett omvänt snedstreck ( ) för att förhindra att följande tecken fungerar som ett specialtecken. Detta kallas att "rymma" karaktären; se exemplet nedan:

Tänk bara på specialtecken som mycket korta kommandon. Om du memorerar deras användningsområden kan det gynna din förståelse av Bash-skalet - och andras manus - oerhört.