[linux] Wat is er fout in dit bash-script?
Paul Slootman
paul+nospam op wurtel.net
Wo Sep 28 11:41:07 CEST 2022
On Wed 28 Sep 2022, Julien Michielsen via Linux wrote:
>
> Heb een eenvoudige forloop in een script gezet (verander filenaam DSC_0000001.JPG in
> dsc.i.jpg, maar bash geeft een foutmelding:
>
>
>
> /home/julien/com/forloop: line 8: syntax error near unexpected token `done'
> /home/julien/com/forloop: line 8: `done'
>
>
>
> Het script:
>
> 1 #!bin/bash
> 2 for i in {1..22}
> 3 #DSC_0000001.html
> 4 do
> 5 echo DSC_390$i.JPG
> 6 if(i LE 9) then mv ./DSC_000000$i.JPG ./dsc_0$i.jpg
> 7 elif i GT 9 then mv ./DSC_00000$i.JPG ./dsc_$i.jpg
> 8 done
Na een "if" hoort die afgesloten te worden door een "fi"
(net zoals een "for" afgesloten wordt door een "done".
De "done" komt voordat een "fi" gezien is, dus wordt die "done" als
onverwacht aangegeven.
Eigenlijk zegt de foutmelding het al...
Verder:
if(i LE 9) then ...
Tussen de haakjes hoort een commando te staan. "i LE 9" is geen
commando.
Haakjes zijn ook niet nodig tenzij je commando's wilt groeperen.
Die gebruik je ook niet op regel 7, waarom dan wel op regel 6?
Ik vermoed dat je bedoelde:
if [ $i -le 9 ]; then ...
of
if [[ $i < 10 ]]; then ...
De laatste met dubbele haken zijn extended tests, de enkele zijn de
originele Bourne shell tests.
Let ook op de ";" achter de test
Dus:
for i in {1..22}
do
echo DSC_390$i.JPG # waarom 390 en geen 000?
if [ $i -le 9 ]
then mv ./DSC_000000$i.JPG ./dsc_0$i.jpg
elif [ $i -gt 9 ]
then mv ./DSC_00000$i.JPG ./dsc_$i.jpg
fi
done
Ik zou het zou doen overigens:
for i in {1..22}; do
x=$(printf '%02d' $i)
mv ./DSC_00000$x ./dsc_$x.jpg
done
Of ('mmv' installeren):
mmv 'DSC_00000??.JPG' 'dsc_#1#2.jpg'
Maar de 1e optie is wel een leuke shell programmeer oefening :-)
Paul
Meer informatie over de Linux
maillijst