Es gibt einen Bash-Debugger, bashdb , der auf vielen Distributionen installiert werden kann. Es verwendet den integrierten erweiterten Debugging-Modus von bash ( shopt -s extdebug
). Es sieht sehr nach gdb aus; Hier ist eine Beispielsitzung, um etwas Geschmack zu geben:
$ ls
1st.JPG 2ndJPG.JPG
$ cat ../foo.sh
for f in *.JPG
do
newf=${f/JPG/jpg}
mv $f $newf
done
$ bashdb ../foo.sh
(foo.sh:1):
1: for f in *.JPG
bashdb<0> next
(foo.sh:3):
3: newf=${f/JPG/jpg}
bashdb<1> next
(foo.sh:4):
4: mv $f $newf
Wie in gdb wird die Anweisung kurz vor ihrer Ausführung angezeigt . So können wir Variablen untersuchen, um zu sehen, was die Anweisung tun wird, bevor sie es tut.
bashdb<2> print $f $newf
1st.JPG 1st.jpg
bashdb<3> next
(foo.sh:1):
1: for f in *.JPG
bashdb<4> next
(foo.sh:3):
3: newf=${f/JPG/jpg}
bashdb<5> next
(foo.sh:4):
4: mv $f $newf
bashdb<6> print $f $newf
2ndJPG.JPG 2ndjpg.JPG
Das wollen wir nicht! Schauen wir uns noch einmal die Parametererweiterung an.
bashdb<7> print $f ${f/JPG/jpg}
2ndJPG.JPG 2ndjpg.JPG
bashdb<8> print $f ${f/JPG$/jpg}
2ndJPG.JPG 2ndJPG.JPG
bashdb<9> print $f ${f/%JPG/jpg}
2ndJPG.JPG 2ndJPG.jpg
OK, das funktioniert. Stellen wir newf
den richtigen Wert ein.
bashdb<10> eval newf=${f/%JPG/jpg}
$? is 0
bashdb<11> print $f $newf
2ndJPG.JPG 2ndJPG.jpg
Sieht gut aus. Setzen Sie das Skript fort.
bashdb<12> next
Debugged program terminated normally. Use q to quit or R to restart.
$ ls
1st.jpg 2ndJPG.jpg