
Dieses Skript funktioniert einwandfrei und ich habe es so geändert, dass es in 5er-Schritten hochzählt. Mein Problem ist, dass ich das letzte Komma am Ende nicht brauche und nicht sicher bin, wie ich es entfernen kann.
for ((i=1, j=0; i <= 12 ; i++, j=j+5))
do
echo -n "$j,"
done
Antwort1
Verwenden Sie für dieses spezielle Problem unter GNU und einigen anderen Systemen einfachseq
:
seq -s, 0 5 55
Das ergibt die Sequenz von 0 bis 55 (einschließlich), getrennt durch ein Komma.
Es gibt einige reine Bash-Optionen, die nützlich sein können, wenn Ihr Problem etwas komplizierter ist, als das Beispiel vermuten lässt. Die Standardoption besteht darin, einfach einen expliziten Test durchzuführen, um festzustellen, ob Sie sich in der letzten Iteration befinden:
for ((i=1, j=0; i <= 12 ; i++, j=j+5))
do
echo -n "$j"
[ $i -lt 12 ] && echo -n ,
done
Hier drucken wir nur $j
jedes Mal aus und prüfen, ob $i
es kleiner als 12 ist (d. h., wir befinden uns nicht bei der letzten Iteration), bevor wir das Komma drucken.
Eine Alternative besteht darin, die gesamte Ausgabe als einzelne Zeichenfolge aufzubauen:
for ((i=1, j=0; i <= 12 ; i++, j=j+5))
do
ACCUM="$ACCUM$j,"
done
echo "${ACCUM%,}"
Hier halten wir ACCUM
das Gleiche, was Sie bereits ausgegeben haben, aber wir geben in der Schleife selbst nichts aus. Sie können das Komma am Ende mit ${ACCUM%,}
: that abschneiden.erweitert sich zuder Wert von ACCUM
mit allem, was am Ende passt, ,
wird abgeschnitten.
Wenn die seq
Option für Ihren Anwendungsfall funktioniert, würde ich mich jedoch dafür entscheiden.
Antwort2
In Bash benötigen Sie selten wirklich eine Schleife:
echo {0..55..5} | sed 's/ /,/g'
Antwort3
Anstatt überall Kommas hinzuzufügen und dann das letzte zu entfernen, gibt es hier eine mögliche „reine Bash“-Lösung, bei der die IFS
Variable in [*]
Form einer Array-Erweiterung verwendet wird
a=( {0..55..5} ); (IFS=, ; printf '%s\n' "${a[*]}")
0,5,10,15,20,25,30,35,40,45,50,55
SehenBashGuide/Arraysfür Einzelheiten – einschließlich einer Erklärung zur Verwendung der (...)
Untershell zum Beibehalten des IFS
Werts der übergeordneten Shell.
Wenn Sie den Array-Ansatz nicht verwenden möchten, können Sie den externen sed
Befehl vermeiden, indem Sie beispielsweise die integrierten Zeichenfolgensubstitutionsfunktionen der Shell verwenden (erneut in Bash):
printf -v str '%s,' {0..55..5}; printf '%s\n' "${str%,}"
0,5,10,15,20,25,30,35,40,45,50,55
Antwort4
Die ausgefeilteren Lösungen, die Sie erhalten haben, sind besser, aber der Vollständigkeit halber können Sie auch einfach das letzte Komma entfernen und Folgendes angeben sed
:
for ((i=1, j=0; i <= 12 ; i++, j=j+5))
do
echo -n "$j,"
done | sed 's/,$//'