Resultat av basename *.pot .pot till script [LÖST]

Här diskuterar vi skal, kommandon och klassiska linuxverktyg.
TicToc
Inlägg: 2266
Blev medlem: 27 dec 2006, 17:28
OS: Kubuntu
Utgåva: 20.04 Focal Fossa LTS

Resultat av basename *.pot .pot till script [LÖST]

Inlägg av TicToc »

Idag har jag ett script jag vill förbättra, nu ser det ut så här:

Kod: Markera allt

#!/bin/bash

SOURCEFILE=$1

if [ -z $SOURCEFILE ]; then
	echo "No source file specified"
	exit 1
fi

msgfmt sv.po
msgfmt sv.po -o $SOURCEFILE
sudo cp $SOURCEFILE /usr/share/locale/sv/LC_MESSAGES/
Nu vill jag slippa ange ett argument och låta

Kod: Markera allt

basename *.pot .pot
"skapa" argumentet, problemet är att jag inte har en susning om hur jag skall bära mig åt!
.mo måste också läggas till det nya namnet.
Senast redigerad av 1 TicToc, redigerad totalt 24 gånger.
Lars
Inlägg: 6191
Blev medlem: 14 jan 2007, 19:31
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Ort: Stockholm

Re: Resultat av basename *.pot .pot till script från script

Inlägg av Lars »

Jag vet inte riktigt om jag förstår vad du vill göra, men det här ger dig kanske några ideer:

Kod: Markera allt

for f in *.pot; do
  echo $(basename $f .pot).mo
done
Eller så kan du bara ersätta "pot" med "mo" så här (sök på "Parameter Expansion" i man bash):

Kod: Markera allt

for f in *.pot; do
  echo ${f/%pot/mo}
done
TicToc
Inlägg: 2266
Blev medlem: 27 dec 2006, 17:28
OS: Kubuntu
Utgåva: 20.04 Focal Fossa LTS

Re: Resultat av basename *.pot .pot till script från script

Inlägg av TicToc »

Tack, nu ser den ut så här och jag är nöjd.

Kod: Markera allt

#!/bin/bash

FILE=$1

if [ -z $FILE ]; then
	for f in *.pot; do
		FILE=${f/%pot/mo}
	done
fi

msgfmt sv.po
msgfmt sv.po -o $FILE
sudo cp $FILE /usr/share/locale/sv/LC_MESSAGES/
Lars
Inlägg: 6191
Blev medlem: 14 jan 2007, 19:31
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Ort: Stockholm

Re: Resultat av basename *.pot .pot till script [LÖST]

Inlägg av Lars »

Jag förstod det som att det finns flera pot-filer i katalogen och att du vill använda alla, det var därför jag lade in en for-slinga. Men om det ska funka som det är tänkt måste du ju använda $FILE inom slingan också, annars förstörs ju $FILE i varje varv.
TicToc
Inlägg: 2266
Blev medlem: 27 dec 2006, 17:28
OS: Kubuntu
Utgåva: 20.04 Focal Fossa LTS

Re: Resultat av basename *.pot .pot till script [LÖST]

Inlägg av TicToc »

Nej, det finns bara en pot-fil i varje katalog. Men jag hade kvar skäp ser jag nu. Den städade ser ut som följer. loopen är altså onödig, men hur skall den ersättas?'

Kod: Markera allt

#!/bin/bash
for f in *.pot; do
	FILE=${f/%pot/mo}
done

msgfmt sv.po -o $FILE
sudo cp $FILE /usr/share/locale/sv/LC_MESSAGES/
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: Resultat av basename *.pot .pot till script [LÖST]

Inlägg av Konservburk »

Du vet alltså att det bara kan finnas en enda .pot-fil i katalogen. Men du vet inte vad den heter? Annat än att filnamnet slutar på ".pot"?
TicToc
Inlägg: 2266
Blev medlem: 27 dec 2006, 17:28
OS: Kubuntu
Utgåva: 20.04 Focal Fossa LTS

Re: Resultat av basename *.pot .pot till script [LÖST]

Inlägg av TicToc »

Konservburk skrev:Du vet alltså att det bara kan finnas en enda .pot-fil i katalogen. Men du vet inte vad den heter? Annat än att filnamnet slutar på ".pot"?
Just så. Tänk om jag också kunde uttrycka mig lika tydligt.
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: Resultat av basename *.pot .pot till script [LÖST]

Inlägg av Konservburk »

Då kan du göra typ så här:

Kod: Markera allt

FILE=(*.pot)
FILE="${FILE%pot}mo"
Men det kommer bara fungera om det finns 1 och endast 1 .pot-fil i katalogen. Jag tar inget ansvar för vad som händer om det skulle råka finnas 0, 2, eller flera när du kör skriptet.

Eftersom du dessutom inte vet exakt vad .pot-filen heter så bör du även se till att alltid använda "$FILE" istället för $FILE om du vill undvika problem med t.ex. mellanrum i filnamnet.
TicToc
Inlägg: 2266
Blev medlem: 27 dec 2006, 17:28
OS: Kubuntu
Utgåva: 20.04 Focal Fossa LTS

Re: Resultat av basename *.pot .pot till script [LÖST]

Inlägg av TicToc »

Oj, det här var ju inte riktigt löst trots rubriken.

Dina två rader funkar inte för mig, resultatet blir *.mo som filnamn, och det blir inte bra. Jag ville alltså ta ut namnet från pot-filen för att skapa en mo-fil.
Nu kör jag det här som verkar funka.

Kod: Markera allt

#!/bin/bash
FILE=$(basename *.pot .pot).mo
msgfmt sv.po -o "$FILE"
sudo cp "$FILE" /usr/share/locale/sv/LC_MESSAGES/
Skriv svar

Återgå till "Terminalforum"