[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