staging.inyokaproject.org

Anfängerfrage zu shell: Variable innerhalb eines Strings

Status: Gelöst | Ubuntu-Version: Ubuntu 18.04 (Bionic Beaver)
Antworten |

AugustQ

Anmeldungsdatum:
24. Oktober 2007

Beiträge: 767

Hi,

ich habe da mal eine Anfängerfrage, bei der ich nicht weiterkomme.

Dies ist ein Kommando, das funktioniert:

1
convert -pointsize 20 -fill black -draw 'text 700, 20 "20:00"'  ../screenshot_00000.jpg  screenshot_00000.jpg

Das funktioniert. Nun will ich aber den Text 20:00 ersetzen durch den Inhalt einer Variablen und das klappt bei mir nicht. So sieht das momentan in meinem Skript aus:

    text_to_file="20:00"
    convert -pointsize 20 -fill black -draw 'text 700, 20 "$text_to_file"'  ../screenshot_00000.jpg  screenshot_00000.jpg

Im Bild steht dann an der Position $text_to_file, also nicht 20:00

Wie bekomme ich den Inhalt dort hin?

Schönen Gruß AugustQ

agschaal

Anmeldungsdatum:
13. August 2009

Beiträge: 680

versuche es mal so: convert -pointsize 20 -fill black -draw 'text 700, 20 $text_to_file' ../screenshot_00000.jpg screenshot_00000.jpg

"$variable" heist $variable, als Text dargestellt, daher in Hochkommas geschrieben. Also keine Variable, nur auszugebender text.

$text_to_file gibt den Inhalt der Variablen aus.

ok?

AugustQ

(Themenstarter)

Anmeldungsdatum:
24. Oktober 2007

Beiträge: 767

Hi,

so habe ich es probiert:

    text_to_file="20"
    convert -pointsize 20 -fill black -draw 'text 700, 20 $text_to_file'  ../screenshot_00000.jpg  screenshot_00000.jpg

Ergebnis:

1
2
../screenshot_00000.jpg
convert-im6.q16: non-conforming drawing primitive definition `text_to_file' @ error/draw.c/DrawImage/3265.

Ich habe es dann noch einmal probiert damit:

    text_to_file="20"
    convert -pointsize 20 -fill black -draw 'text 700, 20 \"$text_to_file\"'  ../screenshot_00000.jpg  screenshot_00000.jpg

Ergebnis:

1
2
../screenshot_00000.jpg
convert-im6.q16: non-conforming drawing primitive definition `$text_to_file"' @ error/draw.c/DrawImage/3265.

Also: das geht nicht.

AugustQ

(Themenstarter)

Anmeldungsdatum:
24. Oktober 2007

Beiträge: 767

nächster Versuch:

    text_to_file="20:00"
    convert -pointsize 20 -fill black -draw 'text 700, 20 "'$text_to_file'"'  ../screenshot_00000.jpg  screenshot_00000.jpg

so scheint es zu gehen.

Ich probiere das morgen noch einmal aus und berichte dann.

AugustQ

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

AugustQ schrieb:

nächster Versuch:

    text_to_file="20:00"
    convert -pointsize 20 -fill black -draw 'text 700, 20 "'$text_to_file'"'  ../screenshot_00000.jpg  screenshot_00000.jpg

so scheint es zu gehen.

Einfacher ist

1
convert -pointsize 20 -fill black -draw "text 700, 20 $text_to_file"  ../screenshot_00000.jpg  screenshot_00000.jpg

Aber wenn Du schon die einfachen Quotes nutzen willst, dann mach es lieber so

1
convert -pointsize 20 -fill black -draw 'text 700, 20 '"$text_to_file"  ../screenshot_00000.jpg  screenshot_00000.jpg

denn Deine Variante hat ein Problem, wenn in $test_to_file ein Leerzeichen auftaucht:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$ for text_to_file in 'problemlos' 'mit Leerzeichen'; do
> args.sh convert -pointsize 20 -fill black -draw 'text 700, 20 "'$text_to_file'"'  ../screenshot_00000.jpg  screenshot_00000.jpg
> done
arg count: 9
arg[1]: 'convert'
arg[2]: '-pointsize'
arg[3]: '20'
arg[4]: '-fill'
arg[5]: 'black'
arg[6]: '-draw'
arg[7]: 'text 700, 20 "problemlos"'
arg[8]: '../screenshot_00000.jpg'
arg[9]: 'screenshot_00000.jpg'
arg count: 10
arg[1]: 'convert'
arg[2]: '-pointsize'
arg[3]: '20'
arg[4]: '-fill'
arg[5]: 'black'
arg[6]: '-draw'
arg[7]: 'text 700, 20 "mit'
arg[8]: 'Leerzeichen"'
arg[9]: '../screenshot_00000.jpg'
arg[10]: 'screenshot_00000.jpg'

Wenn Du tatsächlich doppelte Quotes ausgeben willst, gehen diese Varianten:

1
2
3
convert -pointsize 20 -fill black -draw 'text 700, 20 "'"$text_to_file"'"'  ../screenshot_00000.jpg  screenshot_00000.jpg
convert -pointsize 20 -fill black -draw 'text 700, 20 "'"$text_to_file"\"  ../screenshot_00000.jpg  screenshot_00000.jpg
convert -pointsize 20 -fill black -draw "text 700, 20 \"$text_to_file\""  ../screenshot_00000.jpg  screenshot_00000.jpg

AugustQ

(Themenstarter)

Anmeldungsdatum:
24. Oktober 2007

Beiträge: 767

Hi,

dieser Teil meines Projekts ist abgeschlossen. Und so habe ich es gemacht:

    convert -pointsize 20 -fill black -draw 'text 700, 21 "'$text_to_file'"'  ../$(printf "screenshot_%05d.jpg" $counter)  $(printf "screenshot_%05d.jpg" $counter)

Der Punkt ist, daß der Parameter draw einen Text erwartet, der Leerstellen enthalten kann und zusätzlich den auszugebenden Text darin in Anführungszeichen erwartet.

Hier ist mein komplettes Skript:

#!/bin/bash
#
# add text to file
counter=0

while :
do
    if [ ! -e  ../$(printf "screenshot_%05d.jpg" $counter) ]
    then
         break
     fi
    echo ../$(printf "screenshot_%05d.jpg" $counter)
    text_to_file=$(stat -c %y ../../Originale/$(printf "screenshot_%05d.xwd" $counter) | cut -d ' ' -f2 | cut -d ':' -f 1,2)
#    convert -pointsize 20 -fill black -draw 'text 700, 20 "'$text_to_file'"'  ../../Originale/screenshot_00000.jpg  screenshot_00000.jpg
    convert -pointsize 20 -fill black -draw 'text 700, 21 "'$text_to_file'"'  ../$(printf "screenshot_%05d.jpg" $counter)  $(printf "screenshot_%05d.jpg" $counter)
    (( counter++ ))
 done
     

So, jetzt geht es an die näöchsten Schritte.

Schönen Gruß AugustQ

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

AugustQ schrieb:

    convert -pointsize 20 -fill black -draw 'text 700, 21 "'$text_to_file'"'  ../$(printf "screenshot_%05d.jpg" $counter)  $(printf "screenshot_%05d.jpg" $counter)

Der Punkt ist, daß der Parameter draw einen Text erwartet, der Leerstellen enthalten kann und zusätzlich den auszugebenden Text darin in Anführungszeichen erwartet.

Wie ich oben bereits geschrieben habe, hast Du immer noch ein Problem, wenn $text_to_file Leerzeichen enthält. Dann nimm wenigstens eine der letzten drei Varianten aus meiner letzten Antwort.

Hier ist mein komplettes Skript:

Ich mache mal einen Vorschlag, der nach meinem Dafürhalten um einiges eleganter ist, weil er

  • wiederholte Berechnungen derselben Werte vermeidet,

  • die Uhrzeit einfacher extrahiert und

  • die Schleifenbedingung tatsächlich im Schleifenkopf hat (anstatt mit einem break im Body).

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#!/bin/bash
#
# add text to file
counter=0

while base="../$(printf "screenshot_%05d.jpg" $counter)" && file="../$base" && [ -e "$file" ]; do
  echo "$file"
  text_to_file=$(date -r "../../Originale/$base" '+%H:%M')
  convert -pointsize 20 -fill black -draw "text 700, 21 \"$text_to_file\"" "$file" "$base"
  (( counter++ ))
done

Eigentlich braucht man auch gar nicht die bash:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#!/bin/sh
#
# add text to file
counter=0

while base="../$(printf "screenshot_%05d.jpg" $counter)" && file="../$base" && [ -e "$file" ]; do
  echo "$file"
  text_to_file=$(date -r "../../Originale/$base" '+%H:%M')
  convert -pointsize 20 -fill black -draw "text 700, 21 \"$text_to_file\"" "$file" "$base"
  counter=$((counter + 1))
done

Warum benutzt Du eigentlich kein Globbing, um alle passenden Dateien zu finden? In dem Fall würde man auch Lücken problemlos überspringen können:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
#!/bin/sh
#
# add text to file

while file in ../screenshot_*.jpg; do
  if [ -e "$file" ]; then
    echo "$file"
    base="${file##*/}"
    text_to_file=$(date -r "../../Originale/$base" '+%H:%M')
    convert -pointsize 20 -fill black -draw "text 700, 21 \"$text_to_file\"" "$file" "$base"
  fi
done

AugustQ

(Themenstarter)

Anmeldungsdatum:
24. Oktober 2007

Beiträge: 767

Hi,

und Danke für die Beiträge hier.

Das Projekt ist beendet. Den Zusammenhang findest Du hier: https://forum.ubuntuusers.de/topic/suche-programm-zur-aufnahme-vom-bildschirm/ (siehe letzten Beitrag)

Schönen Gruß AugustQ

Antworten |