Script

Från DannoWiki
Version från den 3 augusti 2026 kl. 19.51 av Danno (diskussion | bidrag) (→fixaudio)
(skillnad) ← Äldre version | Nuvarande version (skillnad) | Nyare version → (skillnad)
Hoppa till navigeringHoppa till sök
 ⚠️ Den här artikeln är under utveckling. Information kan vara ofullständig eller ändras löpande.

lathund för shellscript kommer att finnas här!

PRO-tips

Lägg till dina script i systemets PATH-variabel
så kan du bara skriva namnet på scriptet utan sökväg:

  1. Skapa mappen ~/scripts
  2. Placera alla dina hemmasnickrade script där.
  3. Lägg till följande i din ~/.bashrc:
if [ -d "$HOME/scripts" ] ; then
        PATH="$HOME/scripts:$PATH"
fi

Enkel if-sats

Kolla om en fil finns, och skriv ut resultatet:

if [ -e "fil.txt" ]; then echo "Finns"; else echo "finns ej"; fi

Ett bash-script som frågar om du vill eller inte:

#!/bin/bash
echo "vill du?"
echo "[j/n]"
read fraga

if [ $fraga = "j" ]
then
  echo "Du vill!!"
else
  echo "VA? vill du inte?"
fi

exit 0

Vill vi ha fler val ersätter vi if-satsen mot case:

case "$fraga" in
j)
  echo "Du valde JA"
  ;;
n)
  echo "Du valde NEJ"
  ;;
*)
  echo "Vänligen svara j eller n"
  ;;

esac

fixaudio

En dag när jag kom hem, och startade en dator som varit avstängd, fanns inget ljud ut.
Testade olika lösningar, ominstallation av program, mm. inget hjälpte.
Efter en omstart, fungerade ljudet helt plötsligt.
Lite "forskning" visade att det är inte ovanligt att vissa ljud-program får "hicka" efter att ha varit avstängd.

Följande kan lösa problemet utan reboot: Skapa scriptet fixaudio i lämplig mapp, (jag väljer ~/scripts)som startar om berörda tjänster:

#!/bin/bash
# Nollställ PipeWire och WirePlumber utan att stänga av systemet
echo "Startar om PipeWire-ljudservrarna..."
systemctl --user restart pipewire pipewire-pulse wireplumber
echo "Klart! Testa ljudet igen."

Gör det körbart:

chmod +x ~/scripts/fixaudio

Förhoppningsvis var det bara en tillfällig HDMI-/hårdvaruhicka vid uppstarten och ingenting som kommer tillbaka.

Konvertera bilder

Enkelt script som använder convert för att storleksändra alla jpeg-bilder i samma katalog:

#!/bin/bash
#

FILES="*.jpg
*.JPG"
for i in $FILES
do
  echo $i
  convert -resize 'x75>' -resize '75>' $i $i
done

exit 0

Ta reda på IP-adress

Detta script tar reda på din publika och privata IP-Adress
samt skriver dessa i en textfil:

#!/bin/bash
#
# Detta script tar reda på publik IP och intern IP
# Informationen skrivs i filen ipinfo.txt
#

# tanka hem index.html från dyndns.com:
wget -q http://checkip.dyndns.com

# Hämta IP-Adressen som finns mellan BODY-taggarna:
echo "Publik IP:" > ipinfo.txt
cat index.html | awk ' { sub (/<\/body><\/html>/, ""); print $6}' >> ipinfo.txt

# Hämta intern IP-adress:
echo "Privat IP" >> ipinfo.txt
ifconfig eth0 | grep -v inet6 | awk '/inet/,// { sub (/addr:/, ""); print $2 >> "ipinfo.txt"}'

# Deleta index.html:
rm index.html

Mycket användbart om det ingår i ett större script,
tillexempel en backupp.

Printa variabler

Printa variabeldata utan RIP är inte helt lätt.
Du kan använda OpenOffice.org, men om du har ett DTP-program såsom Scribus, så har du ju en PDF, eller postscriptfil när du är klar.

Postscript

Först: Det går att lägga in variabeldata i postscript
Jag har ännu inte hittat den perfekta lösningen, men det jag ska beskriva nedan fungerar.
Först fixar du databasen.
Det är enkelt, du sparar helt enkelt en kommaseparerad .csv-fil.
Du måste givetvis ha gjort en .ps fil också.
Så scriptet:

#!/bin/bash
IFS=,
while read Knr Grupp Kund Referens Adress1 Adress2 Postadress
do
 echo "$Knr"
 echo "$Kund"
 echo "$Referens"
 echo "$Adress1"
 echo "Adress2"
 echo "Postadress"

 sed -e "s/\%\%Page\: 1 1/\%\%Page\: 1 1\ngsave\n\/Courier\ 10\ selectfont\n950\ 830\ moveto\n("$Kund"\ \ "$Knr")\ show\n950\ 820\ moveto\n("$Adress1")\ show\n950\ 810\ moveto\n("$Adress2")\ show\n950\ 800\ moveto\n("$Postadress")\ show\ngrestore/g" < infil.ps > $Knr.ps

done < databas.csv

echo gör inget annat än att skriva ut variablerna scriptet läser in, på skärmen.
Bara för att visa att det går att använda csv-filer till mer än just postscript.
Raden med sed är den som hittar rätt ställe i .ps-filen, och stoppar in variablerna.
Se sidan om Postscript.

Detta fungerar utmärkt, MEN:
Eftersom det i detta fallet handlar om postscript, så måste specialtecken som &-tecken, dubbel-escapas i databasen.
Detta eftersom scriptet "tar bort" det ena escapetecknet.
Annars kan postscript ta det som ett kommando, och resultatet blir tokigt.
Nästa "bug", märkte jag, är att våra språkliga specialtecken inte fungerar trots escape.
Alltså, har vi åäö men i databasen, kommer det inte att fungera.
Det är inte omöjligt att det går att komma runt på något sätt.

PDF

Ännu enklare, egentligen!
Skapa först brevet som ska adresseras, vi kallar det sid1.pdf
Sen databasen, här använder jag OpenOffice.org, och gör en tom sida, med kopplingsinformation, på rätt position.
Denna skrivs sedan ut till PDF-skrivare, OBSERVERA att det ska bli enstaka utskrifter, dvs. en PDF per adress.
Adresserna kommer att få filnamn som svk16_-_2.pdf
Lägg adress-PDF:erna ovanpå brevet:

for i in sv*.pdf; do pdftk sid1.pdf stamp $i output a$i; done;

Du har nu nya PDF:er med samma namn som adresserna, men med bokstaven a framför.
Och det är klart.
Har du en baksida, eller ännu fler sidor som ska in, lägger du till dessa med:

for i in asv*.pdf; do pdftk A=$i B=sid2.pdf cat A1 B1 output z$i; done;

Så där. Nya filer igen, nu med bokstaven z först i filnamnet.
Bara att ta bort de första, och övrigt du inte vill ha kvar. Sedan printa.
Notera dock att de printas i ordning, men den första kommer att komma sist,
beroende på att den inte fick numreringen.
Se även: Pdftk