[linux] Wat is er fout in dit bash-script?

André Markwat dremarkwat op outlook.com
Do Sep 29 13:10:53 CEST 2022


Mijn Pc start op met de melding;" Kan toetsenbord niet vinden druk op f?. Maar er gebeurt niets. Wel dat ie gewoon verder gaat met opstarten van Linux. Wat kan ik doen om deze melding te omzeilen. Bv dank.

Outlook voor Android<https://aka.ms/AAb9ysg> downloaden
________________________________
From: Linux <linux-bounces op lists.nllgg.nl> on behalf of Paul Slootman via Linux <linux op lists.nllgg.nl>
Sent: Wednesday, September 28, 2022 11:41:07 AM
To: linux op lists.nllgg.nl <linux op lists.nllgg.nl>
Subject: Re: [linux] Wat is er fout in dit bash-script?

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
------------- volgend deel ------------
Een HTML-bijlage is gescrubt...
URL: <https://lists.nllgg.nl/pipermail/linux/attachments/20220929/458bbe2a/attachment.htm>


Meer informatie over de Linux maillijst