So werten Sie verkettete Zeichenfolgen mit mathematischen Werten in einem Bash-Skript aus

So werten Sie verkettete Zeichenfolgen mit mathematischen Werten in einem Bash-Skript aus

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 _FILENAMEVariablen 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 printfist 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 forSchleife möglicherweise besser geeignet als die explizite Auflistung jeder einzelnen Intervallstartnummer.

verwandte Informationen