Ich schreibe ein Bash-Skript, um Podcasts zu erhalten. Das Problem ist, dass einige der Podcast-Nummern einstellig sind, während andere zwei- oder dreistellig sind. Daher muss ich sie auffüllen, damit sie alle drei Stellen haben.
Ich habe folgendes versucht:
n=1
n = printf %03d $n
wget http://aolradio.podcast.aol.com/sn/SN-$n.mp3
Die Variable 'n' bleibt jedoch nicht dauerhaft aufgefüllt. Wie kann ich es dauerhaft machen?
wget $(printf http://aolradio.podcast.aol.com/sn/SN-%03d $n.mp3, $n)
. Fügen Sie einfach die gesamte URL in dieprintf
Anweisung ein.Anscheinend weisen Sie den Rückgabewert des Befehls printf zu (dies ist der Exit-Code). Sie möchten die Ausgabe von printf zuweisen.
bash-3.2$ n=1 bash-3.2$ n=$(printf %03d $n) bash-3.2$ echo $n 001
quelle
Achtung, wenn Ihre Eingabezeichenfolge eine führende Null hat!
printf übernimmt weiterhin das Auffüllen, konvertiert aber auch Ihre Zeichenfolge in das
hexadezimaleOktalformat.# looks ok $ echo `printf "%05d" 03` 00003 # but not for numbers over 8 $ echo `printf "%05d" 033` 00027
Eine Lösung hierfür scheint das Drucken eines Gleitkommas anstelle einer Dezimalzahl zu sein.
Der Trick besteht darin, die Dezimalstellen mit wegzulassen
.0f
.# works with leading zero $ echo `printf "%05.0f" 033` 00033 # as well as without $ echo `printf "%05.0f" 33` 00033
quelle
um Kontextwechsel zu vermeiden:
a="123" b="00000${a}" c="${b: -5}"
quelle
n=`printf '%03d' "2"`
Beachten Sie Abstände und Backticks
quelle
Wie von noselad erwähnt, ist die Befehlsersetzung, dh $ (...), vorzuziehen, da sie Backtics ersetzt, d
`...`
. H.Es ist viel einfacher, damit zu arbeiten, wenn Sie versuchen, mehrere Befehlsersetzungen zu verschachteln, anstatt zu entkommen, dh "Backslashing" - Backtics.
quelle
Dies ist eine Antwort auf eine Antwort von cC Xx. Es funktioniert nur, bis
a
der Wert kleiner als 5 Stellen ist.Überlegen Sie wann
a=12345678
. Die führenden Ziffern werden abgeschnitten:a="12345678" b="00000${a}" c="${b: -5}" echo "$a, $b, $c"
Dies ergibt die folgende Ausgabe:
Das Setzen eines
if
zu überprüfenden Werts vona
ist weniger als 5 Stellen und dann könnte es eine Lösung sein:if [[ $a -lt 9999 ]] ; then b="00000${a}" ; c="${b: -5}" ; else c=$a; fi
quelle