[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