• Reset your password

User account menu

  • Artikler
  • Forside
  • Forum
  • Nyheder
  • Log in
Hjem
Linuxin 2025

Breadcrumb

  • Hjem
  • forums
  • Indlejrede enkelte og dobbelt apostroffer i bash-scripts

Hvad kan du med 100% sikkerhed sige, at du har stemt?

Valgmuligheder
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 in to post comments

Kommentarer5

14 år 5 måneder 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 in to post comments

14 år 5 måneder 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 in to post comments

14 år 5 måneder 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 in to post comments

14 år 5 måneder 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 in to post comments

14 år 5 måneder siden

Permalink

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

Permalink

:-)

:-)

  • Log in to post comments

Svar søges

Den er go 0
Vil du have et sikrere og mere privat internet? Du skal blot installere Vivaldi-browseren med Proton VPN understøttelse! 0
14. februar = I Love Free Software Day 0
Lokal fil-deling - for de dovne. 0
Linux fra begynder til professionel af O'Reilly 0

Seneste aktivitet

Test 2
2 stk Jolla C2 sælges 1
Det første forumindlæg efter installation af Forum-modulet 8
Vanilla OS 12
Nye forum-indlæg viser sig kun 1 gang 1
Vil alle forumindlæg vise sig to gange 1
Hjælp til remote terminal vindue? 3
PCLinuxOS 19
Kan ikke boote på installation 24
80-20 reglen 1
Skærmlys fader ud på min bærbare 8
32 bit distro på max 700mb der stadig understøttes 26
Har vi nogen Linux konsulenter i Slagelse området? 3
Virkelig 7
gnome-software? 3
Archer T2U AC600 Wireless Dual Band USB Adapter 26
En farverig APT 3.0 udgivelse imponerer med sine nye funktioner 2
Unix's fødsel 2
Linux Mint 13
"Intet realistisk alternativ" - mig i r*ven 1

Copyright © 2025 Company Name - All rights reserved

Developed & Designed by Alaa Haddad