He he he… jag var inte särskilt konsekvent när det gäller citat-tecknen för ${Tempfile}, såg jag.Johnny Rosenberg skrev:Ska kolla det där med ${Tempfile} också…
Men jag redigerade inlägget med koden så nu ska det vara ”rätt”.
He he he… jag var inte särskilt konsekvent när det gäller citat-tecknen för ${Tempfile}, såg jag.Johnny Rosenberg skrev:Ska kolla det där med ${Tempfile} också…
Då kanske vi ska bashifiera skriptet lite istället.Johnny Rosenberg skrev:Jag tycker för min del att bash är tillräckligt portabelt och jag vill hellre lära mig fördelarna med att använda bash istället för att vara kompatibel med sh.
Kod: Markera allt
echo "${Line}" | sed "s;\(.*\);DESCRIPTION=\1;" >> "${Tempfile}"
Det är att jag först skapar en textfil som ser ut så här (exempelvis):Konservburk skrev:Då kanske vi ska bashifiera skriptet lite istället.Johnny Rosenberg skrev:Jag tycker för min del att bash är tillräckligt portabelt och jag vill hellre lära mig fördelarna med att använda bash istället för att vara kompatibel med sh.
Vad är förresten tanken bakom detta?
Kod: Markera allt
echo "${Line}" | sed "s;\(.*\);DESCRIPTION=\1;" >> ${Tempfile}
Men denna information ska ju in i en FLAC-fil senare i form av taggar. I FLAC-filer är det ju tillåtet att ha flera taggar av samma typ, exempelvis om det är två artister som framför en låt så kan man ange dem i var sin ARTIST-tagg.Drums: Someone
Bass guitar: Someone else
Rhythm guitar: A friend
Lead Guitar: Me
Detta vill ja ju helst slippa i textfilen när jag själv ska in där och rota, men jag lägger alltså till det med sed i den rad du citerade strax innan metaflac får ta del av informationen.DESCRIPTION=Drums: Someone
DESCRIPTION=Bass guitar: Someone else
DESCRIPTION=Rhythm guitar: A friend
DESCRIPTION=Lead Guitar: Me
Några förslag?Konservburk skrev:Då kanske vi ska bashifiera skriptet lite istället.
OK, då är jag med.Johnny Rosenberg skrev:Detta vill ja ju helst slippa i textfilen när jag själv ska in där och rota, men jag lägger alltså till det med sed i den rad du citerade strax innan metaflac får ta del av informationen.
Kod: Markera allt
echo "DESCRIPTION=${Line}" >> "${Tempfile}"
Kod: Markera allt
mv "${Tempfile}" "${Tempfile}.old"
touch ${Tempfile}
while read Line; do
echo "${Line}" | sed "s;\(.*\);DESCRIPTION=\1;" >> "${Tempfile}"
done < "${Tempfile}.old"
Kod: Markera allt
sed -i 's/^/DESCRIPTION=/' "$Tempfile"
Kod: Markera allt
#!/bin/bash
a=0
while
(( a++ ))
echo "\$a variable is: $a"
[[ "$a" -lt "10" ]]
do :
done
Stod just i duschen och tänkte på det också. Har ju försökt lära mig lite om sed de senaste dagarna och nu har jag uppenbarligen snöat in på det. I just den raden behövs ju inte sed alls.Konservburk skrev:OK, då är jag med.Johnny Rosenberg skrev:Detta vill ja ju helst slippa i textfilen när jag själv ska in där och rota, men jag lägger alltså till det med sed i den rad du citerade strax innan metaflac får ta del av informationen.
Anledningen till att jag frågade var att tyckte det borde gå lika bra med:
Kod: Markera allt
echo "DESCRIPTION=${Line}" >> "${Tempfile}"
Det där var ju elegant. Tänkte inte på att man kan köra sed direkt på en fil så där. Ännu en lärdom att ta till sig! Och många finns kvar…Konservburk skrev:Men nu när jag förstår vad du är ute efter så inser jag att du istället borde kunna ersätta alla dessa rader:
...med en enda sed-rad så här:Kod: Markera allt
mv "${Tempfile}" "${Tempfile}.old" touch ${Tempfile} while read Line; do echo "${Line}" | sed "s;\(.*\);DESCRIPTION=\1;" >> "${Tempfile}" done < "${Tempfile}.old"
Kod: Markera allt
sed -i 's/^/DESCRIPTION=/' "$Tempfile"
Kod: Markera allt
#!/bin/bash
# add-musician-info
# Use this crap at your own risk…
#
# Johnny Rosenberg 2010-11-19 23:24:38
# REQUIREMENTS (obviously…)
# ≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈
# bash: sudo apt-get install bash
# flac: sudo apt-get install flac
# zenity: sudo apt-get install zenity
# ubuntu or similar: sudo apt-get install ubuntu (kidding… ;D )
# gedit: sudo apt-get install gedit
# (or use another text editor – just change the line below)
Editor="gedit"
InstrumentsList="${HOME}/.RosenTagg/Instruments"
MusiciansList="${HOME}/.RosenTagg/Musicians"
Tempfile="${HOME}/.RosenTagg/Tempfile"
if [[ $# != 1 ]]; then # Too many or too few arguments
zenity --error \
--width 300 \
--title "Skit bakom tangentbordet" \
--text="Syntax:\n\n\tadd-musician-info FILE"
exit 1
fi
SoundFile=$1
# Check the file. Is it a real FLAC file?
Error=$(flac -t "${SoundFile}" 2>&1 | grep error)
if [[ $Error ]]; then # Not a real FLAC file
Message="Filen är antingen ingen FLAC-fil,\n"
Message="${Message}eller så är den felaktig."
zenity --error \
--width 300 \
--title "Ogiltig fil" \
--text="${Message}"
exit 1
fi
if [[ -f "${Tempfile}" ]]; then
rm "${Tempfile}"
fi
touch "${Tempfile}"
Text="Välj från listan.\n"
Text="${Text}Klicka ”Avsluta” när\n"
Text="${Text}du är färdig."
while Instrument=$(zenity --list \
--title "Välj musikinstrument" \
--text="${Text}" \
--column="Instrument" \
--height=460 \
--width=250 < "${InstrumentsList}") && \
Musicians=$(zenity --list \
--title "Välj musikutövare" \
--text="${Text}" \
--column="Val" \
--column="Instrument" \
--checklist \
--separator=", " \
--height=460 \
--width=250 < "${MusiciansList}"); do
echo "${Instrument}: ${Musicians}" >> "${Tempfile}"
done
$("${Editor}" "${Tempfile}")
Text="Din text kan nu redigeras i din\n"
Text="${Text}textredigerare. Gör eventuella\n"
Text="${Text}ändringar, spara och stäng text-\n"
Text="${Text}redigeraren.\n\n"
Text="${Text}Vill du fortsätta?\n"
if ! zenity --question \
--title="Kontrollera" \
--text="${Text}"; then
zenity --info \
--title="Hej då" \
--text="Inga filer har ändrats."
rm "${Tempfile}"
exit 1
fi
Message="Vill du först rensa filen\n"
Message="${Message}från befintliga kommentarer?"
if zenity --question \
--title="Rensa?" \
--text="${Message}"; then
metaflac --remove-tag=DESCRIPTION "${SoundFile}"
fi
metaflac --remove-tag=COMMENT "${SoundFile}"
metaflac --remove-tag=COMMENTS "${SoundFile}"
sed -i 's/^/DESCRIPTION=/' "$Tempfile"
metaflac --import-tags-from="${Tempfile}" "${SoundFile}"
rm "${Tempfile}" "${Tempfile}.old"
Det var ju det jag sa.ubot skrev:Ja, tänka sig. Det fungerar ju
Det kallas för place a label och användes förr i tiden ihop med goto innan det kommandot togs bort:ubot skrev:Vad betyder : efter do? Varför ska det vara ett :-tecken efter do?
Kod: Markera allt
: plats
kod
mer kod
goto plats
Kod: Markera allt
: det här är en kommentar
Kod: Markera allt
if villkor
then :
else
kommando
fi
Kod: Markera allt
if ! villkor
then
kommando
fi
Kod: Markera allt
: ${variabel=defaultvärde}
Bash-utvecklarna lär ju känna till det…Konservburk skrev:Det var ju det jag sa.ubot skrev:Ja, tänka sig. Det fungerar ju![]()
Nu undrar jag bara om folket i #bash känner till det där med att man kan anväda klamrar istället för do och done i for-loopar?
Vad kan du göra med ”#” som du inte kan göra med ”:”? Alltså, på vilket sätt är ”#” mer flexibelt?Konservburk skrev:Det kallas för place a label och användes förr i tiden ihop med goto innan det kommandot togs bort:ubot skrev:Vad betyder : efter do? Varför ska det vara ett :-tecken efter do?
Därefter kom det att användas för enkla kommentarer innan det mer flexibla # infördes:Kod: Markera allt
: plats kod mer kod goto plats
Kod: Markera allt
: det här är en kommentar
Det där var intressant, det ska jag komma ihåg. Det blir ju nästan som att deklarera en variabel, på sätt och vis.Konservburk skrev:Numera användas den mest som no-op på det sättet som jag gjorde och som du frågade om. Här är ett annat exempel på samma användning:
...vilket är ett mer portabelt sätt att skriva detta:Kod: Markera allt
if villkor then : else kommando fi
Det kan även användas för att sätta default-värden på variabler så här:Kod: Markera allt
if ! villkor then kommando fi
...dvs att sätta ett värde på variabeln bara om variabeln inte redan finns, vilket kan vara väldigt praktiskt ibland.Kod: Markera allt
: ${variabel=defaultvärde}
Jo, de gör de förstås.Johnny Rosenberg skrev:Bash-utvecklarna lär ju känna till det…Konservburk skrev:Nu undrar jag bara om folket i #bash känner till det där med att man kan anväda klamrar istället för do och done i for-loopar?
Det går ju göra så här, vilket är ganska likt C, förutom att det är dubbelparantes:Johnny Rosenberg skrev:Har förresten läst någonstans nyligen om loopar på C-vis, men jag är inte säker på att just for-in-varianten nämndes.
Kod: Markera allt
for ((i=0; i<5; i++)) {
echo $i
}
Av någon outgrundlig anledning så fungerar det bara med just for-loopar.Johnny Rosenberg skrev:Kan man använda {} i alla typer av loopar eller är det bara for-looparna som är förbehållna denna lyx?
Det finns ett skal som heter rc som jag har för mig kommer ganska nära C-syntax.Johnny Rosenberg skrev:På den gamla goda tiden (slutet av 1980- och början av 1990-talet) när man gick på en högskola där man använde terminaler uppkopplade på en Unix-maskin programmerade man ju mest i C, men skolans maskin hade ju inte bash utan csh och senare tcsh. Dessa var ju ganska lika C, men inte ens där har jag för mig att man använde klamrar förbehållslöst. Någon som vet om det finns något annat skal där skript följer C-syntaxen så likt som möjligt?
Kod: Markera allt
sudo apt-get install rc
Du måste ha ett mellanrum efter : innan själva kommentaren, vilket du inte behöver med #Johnny Rosenberg skrev:Vad kan du göra med ”#” som du inte kan göra med ”:”? Alltså, på vilket sätt är ”#” mer flexibelt?
Kod: Markera allt
#kommentar
:det här fungerar inte
: men det här fungerar
Kod: Markera allt
kommando #kommentar
kommando : det här fungerar inte
kommando ;: men det här fungerar
Fast de verkar inte vara så pigga på dokumentation…Konservburk skrev:Jo, de gör de förstås.Johnny Rosenberg skrev:Bash-utvecklarna lär ju känna till det…Konservburk skrev:Nu undrar jag bara om folket i #bash känner till det där med att man kan anväda klamrar istället för do och done i for-loopar?
Fast det brukar jag ha ändå… Ser snyggare ut då, tycker i alla fall jag. Men de andra aspekterna du nämnde är ju mer avgörande.Konservburk skrev:Du måste ha ett mellanrum efter : innan själva kommentaren, vilket du inte behöver med #
Det går faktiskt att ha riktiga heltalsvariabler istället för bara strängar överallt. Och då kan du till och med räkna med dem rakt av utan en massa extra paranteser. Testa detta så får du se vad jag syftar på:Johnny Rosenberg skrev:En sak som jag har lite svårt att vänja mig vid, är ju att allting verkar vara strängar och ändå kan man räkna med dem som om de vore numeriska om de råkar innehålla siffror. Känns väldigt förvirrande…
Kod: Markera allt
declare -i heltal=5
echo $heltal
heltal++
echo $heltal
heltal+=2
echo $heltal
Vad gör jag för fel?Konservburk skrev:Det går faktiskt att ha riktiga heltalsvariabler istället för bara strängar överallt. Och då kan du till och med räkna med dem rakt av utan en massa extra paranteser. Testa detta så får du se vad jag syftar på:Johnny Rosenberg skrev:En sak som jag har lite svårt att vänja mig vid, är ju att allting verkar vara strängar och ändå kan man räkna med dem som om de vore numeriska om de råkar innehålla siffror. Känns väldigt förvirrande…
Det här är förstås bash-specifikt, men det var ju inte något hinder för dig.Kod: Markera allt
declare -i heltal=5 echo $heltal heltal++ echo $heltal heltal+=2 echo $heltal
Kod: Markera allt
> declare -i foo=2
> foo++
zsh: command not found: foo++
> bash
$ declare -i foo=2
$ foo++
bash: foo++: command not found
Det är jag som gjorde fel.dmz skrev:Vad gör jag för fel?
Kod: Markera allt
> declare -i foo=2 > foo++ zsh: command not found: foo++ > bash $ declare -i foo=2 $ foo++ bash: foo++: command not found
Kod: Markera allt
declare -i foo=3
foo+=1
echo $foo
Vad är Glenda…?dmz skrev:Intressant.
För att återknyta till rc som är defaultskalet i plan9 så måste jag säga att dess syntax, om än något märklig på vissa ställen, är betydligt trevligare än *sh's.
Lite synd att Glenda är så otroligt värdelös, allting annat verkar så oerhört fint.
Kod: Markera allt
metaflac --export-tags-to="${Tempfile}" "${SoundFile}"
sed -i 's/DESCRIPTION=//' "${Tempfile}"
sed -i 's/\(^.\)\(.*\)=\(.*\)/\U\1\L\2:\n\E\3\n/' "${Tempfile}"
zenity --text-info \
--title="Taggar i ”${SoundFile}”" \
--height=768 \
--width=600 \
--filename="${Tempfile}"
Kod: Markera allt
TITLE=Me And Bobby McGee
ARTIST=Mikael Nordgren & Johnny Rosenberg
ALBUM=Wodixprojektet
DISCNUMBER=1
DATE=2010
TRACKNUMBER=02
GENRE=Pop
COMPOSER=Kris Kristofferson, Fred Foster
PERFORMER=Roger Miller
ENCODED-BY=Audacity 1.3.12-beta
DESCRIPTION=Drum machine programming: Johnny Andersson
DESCRIPTION=Bass guitar: Johnny Andersson
DESCRIPTION=Rhythm guitar: Johnny Andersson
DESCRIPTION=Acoustic guitar: Johnny Rosenberg
DESCRIPTION=Lead guitar: Johnny Rosenberg
DESCRIPTION=Backing vocals: Johnny Rosenberg, Mikael Nordgren
DESCRIPTION=Lead vocal: Mikael Nordgren
Kod: Markera allt
Title:
Me And Bobby McGee
Artist:
Mikael Nordgren & Johnny Rosenberg
Album:
Wodixprojektet
Discnumber:
1
Date:
2010
Tracknumber:
02
Genre:
Pop
Composer:
Kris Kristofferson, Fred Foster
Performer:
Roger Miller
Encoded-by:
Audacity 1.3.12-beta
Drum machine programming: Johnny Andersson
Bass guitar: Johnny Andersson
Rhythm guitar: Johnny Andersson
Acoustic guitar: Johnny Rosenberg
Lead guitar: Johnny Rosenberg
Backing vocals: Johnny Rosenberg, Mikael Nordgren
Lead vocal: Mikael Nordgren
Du undrar om din två sed-rader ovan kan ersättas med något annat? De kan ju förstås ersättas med en enda sed-rad, vilket blir något effektivare eftersom sed då bara behöver gå igenom och ändra i filen en gång istället för två.Johnny Rosenberg skrev:Dock infinner sig känslan obönhörligt, att koden ovan kunde optimeras på ett eller annat sätt, exempelvis så att den blir smidigare, snabbare eller både ock… Någon som har några synpunkter? Har ju använt sed en del här och det är ju ett trevligt verktyg, men det kanske finns tillfällen då annat passar bättre?