Letztes Zeichen aus einer Echovariable entfernen

Letztes Zeichen aus einer Echovariable entfernen

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 $jjedes Mal aus und prüfen, ob $ies 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 ACCUMdas 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 ACCUMmit allem, was am Ende passt, ,wird abgeschnitten.

Wenn die seqOption 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 IFSVariable 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 IFSWerts der übergeordneten Shell.


Wenn Sie den Array-Ansatz nicht verwenden möchten, können Sie den externen sedBefehl 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/,$//'

verwandte Informationen