• 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

14 år 6 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 ind eller opret dig for at tilføje kommentarer

# 2

14 år 6 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 ind eller opret dig for at tilføje kommentarer

# 3

14 år 6 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 ind eller opret dig for at tilføje kommentarer

# 4

14 år 6 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 ind eller opret dig for at tilføje kommentarer

# 5

14 år 6 måneder 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

llumos Unix-operativsystem, 0
Den er go 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

Gode anmeldelser Zorin OS 17.3 1
"Intet realistisk alternativ" - mig i r*ven 15
Nulstilling af adgangskode 3
Ingen Mint 5
Linux App Store Flathub når 3 milliarder downloads 2
Digitaliseringsministeriet sætter gang i pilotprojekt om digital suverænitet 3
Mest sikker webbrowser 5
Firefox 2
Privatbeskeder 7
Backup/synkronisering? 3
BigLinux 5
Chatgpt satire 1
Læsning af databasefil i Firefox 2
Vanilla OS 15
Pepsi Challenge 4
Linuxin er nu migreret til Drupal 11 13
Et Dansk alternativ til Facebook 18
Ekstern Blu-ray-brænder, der fungerer med PCLinuxOS 3
Københavns og Aarhus Kommune dropper MS 9
Open Source-eksperimentet 1

© 2025 Linuxin og de respektive skribenter

Oprettet og drevet af nørder siden 2004 !