Есть отладчик bash, bashdb, который является устанавливаемым пакетом на многих дистрибутивах. Он использует встроенный расширенный режим отладки bash (shopt -s extdebug
). Он очень похож на gdb; вот пример сессии для придания некоторого вкуса:
$ 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
Как и в gdb, оператор показан только до , который вот-вот будет выполнен. Таким образом, мы можем исследовать переменные, чтобы увидеть, что оператор будет делать до того, как он это сделает.
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
Это не то, чего мы хотим! Давайте еще раз посмотрим на расширение параметра.
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, это работает. Установим newf
на правильное значение.
bashdb<10> eval newf=${f/%JPG/jpg}
$? is 0
bashdb<11> print $f $newf
2ndJPG.JPG 2ndJPG.jpg
Выглядит неплохо. Продолжайте скрипт.
bashdb<12> next
Debugged program terminated normally. Use q to quit or R to restart.
$ ls
1st.jpg 2ndJPG.jpg
Replace:
\(\d{1,2}\)\.
With:
.
Я не уверен, что [1127095]depmod[1127096] сообщит о наличии несовместимых модулей.