Nieuws:

Welkom, Gast. Alsjeblieft inloggen of registreren.
Heb je de activerings-mail niet ontvangen?

Auteur Topic: Bash "for" commando  (gelezen 1116 keer)

Offline bijd3hand

  • Lid
Bash "for" commando
« Gepost op: 2015/11/30, 19:16:47 »
Wat doet "for"precies nu in Bash? Het start geen for-next loop.
Ik heb dit handige commando in bash om een hele directory bestanden om te zetten van flac naar alac met ffmpeg. Het kan ook een ander outputformaat zijn natuurlijk, zoals ogg.
#!/bin/bash
for f in *.flac; do ffmpeg -i "$f" -acodec alac "${f%.flac}.m4a"; done

Het is voor mij onbegrijpelijk: for f in *.flac. Gaat de filenaam dan in string f? Of is f helemaal geen string? En waarom wordt er een $ later voor f gezet, als je de conversie mbv ffmpeg gaat starten???

Het is lastig, de huidige programmeertalen, als je alleen in Commodore 64 BASIC hebt leren programmeren :D

Offline MKe

  • Lid
Re: Bash "for" commando
« Reactie #1 Gepost op: 2015/11/30, 20:04:11 »
Dat is juist wel wat het doet, het start een for next loop.

Je commando is eigelijk zo:
for f in *.flac
do
    ffmpeg -i "$f" -acodec alac "{f%.flac}.mp4a
done

De loop zit tussen do en done en de lijst waardoor je loopt is *.flac, dus alle bestanden die eindigen  .flac.
f is een variabele, waarin elke iteratie weer een nieuwe pad naar een file staat. Inde eerste regel declareer je de functie, vandaar geen $ en later lees je hem uit, dan wel een $.

Re: Bash "for" commando
« Reactie #2 Gepost op: 2015/11/30, 20:13:44 »
De for loop in bash ligt dichter bij een foreach loop. Je kan *.flac zien als een array van alle bestandsnamen in de huidige map die op .flac eindigen, de for loop kent dan één voor één deze toe aan f. Als ik het me nog goed herinner, zou dit ongeveer gelijk moeten zijn aan de volgende C64 Basic code:

for i = 0 to len(ar$)
let f$ = ar$[i]
rem doe hier iets
next i

Het dollarteken wordt in bash voor alle types variabelen gebruikt, niet alleen strings. De enige uitzondering is wanneer je assignt aan een variable (of in een for loop, wat ook een soort assignment is), dan zet je er juist géén dollar voor. Bijvoorbeeld:

f=3         # Zet f op 3 -- let op, geen dollar
echo $f     # Gebruik f in een commando -- wel doller
f=5         # Verander waarde van f -- wederom geen dollar
echo $f     # Toont de nieuwe waarde van f -- wederom wel dollar

I use a Unix-based system, that means I'll get laid as often as I have to reboot.
LibSylph
SeySayux.net

Offline bijd3hand

  • Lid
Re: Bash "for" commando
« Reactie #3 Gepost op: 2015/11/30, 20:22:50 »
Ok, en f%? Wat zegt dat in "${f%.flac}.m4a" ?

Gek genoeg valt .flac dan in je output weg. Of komt dat door f%??


Re: Bash "for" commando
« Reactie #4 Gepost op: 2015/11/30, 22:42:05 »
Ja, ${variabele%patroon} haalt een gevonden patroon weg aan het einde van de variabele. Om preciezer te zijn haalt % de kortste overeenkomst met dat patroon weg en %% de langste.

http://tldp.org/LDP/abs/html/parameter-substitution.html


Offline Johan van Dijk

  • Administrator
    • johanvandijk
Re: Bash "for" commando
« Reactie #5 Gepost op: 2015/11/30, 23:29:58 »
Voor simpele dingen is deze site wel handig.

Naast Bash kent hij ook wel een aantal andere commando's, maar parameter substitution en andere manipulatie van variabelen doet hij helaas nog niet altijd.