Ich versuche, diese Zeichenfolgen als Ausgabe für Elemente ungleich Null zu erhalten:
[21-40]
[41-60]
[61-80]
[81-100]
Aber das folgende Skript versucht irgendwie, den Inhalt der _FILENAME
Variablen auszuwerten.
#!/bin/bash
for i in 0 21 41 61 81
do
if (( $i > 0 ))
then
_FILENAME="[$i-$((i+19))]"
else
_FILENAME="First File"
fi
echo $_FILENAME
done
Ich bin sicher, dass mir hier etwas Syntax fehlt.
Antwort1
Verwenden Sie doppelte Anführungszeichen um Variablenreferenzen, wie $_FILENAME
. Ohne doppelte Anführungszeichen versucht die Shell, den Inhalt der Variablen in mehrere „Wörter“ aufzuteilen und alle gefundenen Dateiglobs (Platzhalterausdrücke) zu erweitern. Ausdrücke wie[21-40]
Sindglobs (dieser passt zu allen Dateien mit den Namen „2“, „1“ bis „4“ oder „0“). Wenn Sie im aktuellen Verzeichnis Dateien mit übereinstimmenden Namen haben, wird die Liste der Dateien anstelle des Klammerausdrucks gedruckt. Sie müssen also nur Folgendes verwenden:
echo "$_FILENAME"
anstelle der Version ohne Anführungszeichen. Übrigens ist es auch am besten, für Shellvariablennamen Kleinbuchstaben (oder Groß- und Kleinschreibung) zu verwenden, um Konflikte mit den vielen magischen Variablen zu vermeiden, die für die Shell oder andere Programme eine besondere Bedeutung haben.
Antwort2
Gordon hat die Probleme mit Ihrem Code richtig beschriebenin seiner Antwort. Ich gebe Ihnen eine alternative Version Ihres Codes, so wie ich ihn geschrieben hätte:
echo 'First file'
for (( i = 20; i < 100; i += 20 )); do
printf '[%d-%d]\n' "$(( i + 1 ))" "$(( i + 20 ))"
done
Die Verwendung von printf
ist im Allgemeinen sicherer für die Ausgabe benutzerdefinierter oder variabler Daten. Siehe z. B.Warum ist printf besser als echo?
Da die Intervalle regelmäßig sind, ist eine C-artige for
Schleife möglicherweise besser geeignet als die explizite Auflistung jeder einzelnen Intervallstartnummer.