• Opret dig
  • Glemt adgangskode

User account menu

  • Artikler
  • Forside
  • Forum
  • Nyheder
  • Log ind
Hjem
LinuxIN.dk

Snak med

Opret dig!

Af marlar | 09.12.2010 20:40

Indlejrede enkelte og dobbelt apostroffer i bash-scripts

Programmering
Det har altid voldt mig enormt besvær at blande enkelte og dobbelt apostroffer i scripts.

Tag for eksempel denne som sender en mail hvis der er mindre end 80% ledig plads:


df -h | awk --re-interval 'BEGIN { FS = " " } /[0-9]{1,2}%/ {if(strtonum($5)>=80) {system("echo "$0" | mail -s \"SERVER IS RUNNING LOW ON SPACE\" my@email.dk")}}'


Den sender blot en enkelt linje i mailen, fx :

/dev/sda7 9.2G 3.4G 5.4G 90% /var og det styres af awk-variablen $0.

Men hvis jeg vil have en hel sætning puttet ind så virker det ikke:


df -h | awk --re-interval 'BEGIN { FS = " " } /[0-9]{1,2}%/ {if(strtonum($5)>=80) {system("echo "There is only $5 percent left on the server: $0" | mail -s \"SERVER IS RUNNING LOW ON SPACE\" my@email.dk")}}'


Her står der altså There is only $5 percent left on the server: $0 i stedet for bare $0

I mail-linjen er det lykkedes mig at indsætte en sætning ved at escape dobbelt-apostrofferne men det går ikke her.

Hvad er der galt, og hvordan styrer man i det hele taget disse apostrofblandinger?
  • Log ind eller opret dig for at tilføje kommentarer

Kommentarer5

# 1

15 år 1 måned siden

Permalink

Indsendt af mich den 10. december 2010 kl. 02:00

Permalink

Blot et forslag. Jeg har

Blot et forslag. Jeg har ikke prøvet det:

df -h | awk --re-interval 'BEGIN { FS = " " } /[0-9]{1,2}%/ {if(strtonum($5)>=80) {print "There is only", $5, "percent left on the server:", $0 }}' | mail -s "SERVER IS RUNNING LOW ON SPACE" my@email.dk


Se mere i The AWK manual: http://people.cs.uu.nl/piet/docs/nawk/nawk_toc.html
  • Log ind eller opret dig for at tilføje kommentarer

# 2

15 år 1 måned siden

Permalink

Indsendt af mrbrown79 den 10. december 2010 kl. 11:53

In reply to Blot et forslag. Jeg har by mich

Permalink

Ligesom mich..

..ville jeg bare lade awk generere strengen og så smide den videre i bash til mail eller hvad du nu måtte ønske.

Anyway, kan det virkelig passe at det ikke virker at escape de anførselstegn omkring strengen?:

df -h | awk --re-interval 'BEGIN { FS = " " } /[0-9]{1,2}%/ {if(strtonum($5)>=80) {system("echo \"There is only $5 percent left on the server: $0\" | mail -s \"SERVER IS RUNNING LOW ON SPACE\" my@email.dk")}}'


Alternativt, så drop dem helt - det kan echo godt håndtere:

df -h | awk --re-interval 'BEGIN { FS = " " } /[0-9]{1,2}%/ {if(strtonum($5)>=80) {system("echo There is only $5 percent left on the server: $0 | mail -s \"SERVER IS RUNNING LOW ON SPACE\" my@email.dk")}}'


(begge dele er utestet herfra)

Sådan generelt kender jeg godt det med flere hierarkier i strengen og de problemer, det giver. Det ender nogengange i obskure/ulæselige ting med dobbelt-escapes osv. Ofte er det pænere at dele tingene op i stedet for at insistere på at fyre en one-liner af (selvom fristelsen er stor:)).
  • Log ind eller opret dig for at tilføje kommentarer

# 3

15 år 1 måned siden

Permalink

Indsendt af marlar den 10. december 2010 kl. 14:55

Permalink

#1: Dette forslag virker

#1: Dette forslag virker perfekt! Den løsning havde jeg ikke tænkt på.

#2: Hvad enten man escaper apostrofferne eller helt undlader dem, bliver den resulterende tekst i mailen blot: There is only percent left on the server: sh

Tallet mangler, og hvor sh kommer fra, kan jeg ikke helt greje.
  • Log ind eller opret dig for at tilføje kommentarer

# 4

15 år 1 måned siden

Permalink

Indsendt af mrbrown79 den 13. december 2010 kl. 13:08

In reply to #1: Dette forslag virker by marlar

Permalink

#2: Hvad enten man escaper

#2: Hvad enten man escaper apostrofferne eller helt undlader dem, bliver den resulterende tekst i mailen blot: There is only percent left on the server: sh

Det er jo tydeligvis fordi det er shell'en, der fortolker variablerne og IKKE awk. ($0 i en shell giver shell'ens navn - i dette tilfælde "sh").

Nu har du jo løst opgaven, men for forståelsens skyld kan du jo nok løse det ved at hive variablerne udenfor strengen og istedet lade awk fortolke dem og append'e dem til den resulterende streng. Mon ikke flg. gør jobbet:


df -h | awk --re-interval 'BEGIN { FS = " " } /[0-9]{1,2}%/ {if(strtonum($5)>=80) {system("echo \"There is only " $5 " percent left on the server: " $0 " \" | mail -s \"SERVER IS RUNNING LOW ON SPACE\" my@email.dk")}}'
  • Log ind eller opret dig for at tilføje kommentarer

# 5

15 år 1 måned siden

Permalink

Indsendt af mich den 10. december 2010 kl. 15:18

Permalink

:-)

:-)
  • Log ind eller opret dig for at tilføje kommentarer

Svar søges

GRUB 2.14 introducerer understøttelse af EROFS, forbedringer til Btrfs og LVM 0
KDE Plasma 6.6 tilføjer en funktion, som brugerne har spurgt efter i evigheder 0
Linux i København 12.01.2026: Open source i det offentlige 0
Dansk distro Omarchy 0
KDE overgår indsamlingsmålet for 2025 med rekordstor støtte fra lokalsamfundet 0

Seneste aktivitet

BigLinux 1
E-mail blues 6
Linux Mint 22.3 - hvornår opdatere? 10
Canon-printer: Jeg savner "Ink-Toner Level"-meddelelse 10
billede af nuværende installation 2
mapper 4
LinuxIn live 9
Linux Debian på ekstern HD 4
usb disk *LØST* 2
Pacman kunne erstattes af en anden Rust baseret mulighed 1
Epson skanner software 8
Debian 1
Printer Epson ET-2865 problem 8
Winboat 4
Nu kan man skrive private beskeder 14
Mint på imac 2009 34
Firefox AI 7
Kunstig inteligens 6
Kopiering til min Samsung telefon 9
Installation af programmer 21

© 2026 Linuxin og de respektive skribenter

Oprettet og drevet af nørder siden 2004 !