2017-12-28 13 views
1

In meinem Skript frage ich den Benutzer nach einer Eingabe und speichere sie in einigen Variablen. Bevor Sie die Strings in den Variablen verwenden, möchte ich sie ausschneiden, wenn sie zu lang sind, und am Ende eine Ellipse einfügen. Also setze ich alle Variablen in ein Array und sende sie durch eine Schleife und eine if-Anweisung und ordne den neuen Wert der Variablen im Array neu. Ich habe viele Wege ausprobiert und keiner hat gearbeitet. Das folgende ist ein Beispiel:Array durchlaufen, der Variablen im Array einen neuen Wert zuweisen

preset1="Short string" 
preset2="Not long very string" 
preset3="A very long string here which we will then cut" 

presets=("${preset1}" "${preset2}" "${preset3}") 

for x in "${presets[@]}"; do 
    if [[ "${#x}" -gt 20 ]]; then 
     y="${x:0:20}..." 
     presets[$x]="$y" 
    fi 
done 

Bitte helfen Sie!

Antwort

1

Sie müssen Schleife über Indizes der Array, um die Werte zu ändern:

for x in "${!presets[@]}"; do 
    str=${presets[$x]} 
    ((${#str} > 20)) && presets[$x]="${str:0:20}..." 
done 

Works für assoziativen und spärlichen Arrays als auch.


Für Abwechslung können Sie auch verwenden nur Parameter Expansion wie folgt aus:

for x in "${!presets[@]}"; do 
    str=${presets[$x]} 
    suffix=${str:20} 
    presets[$x]=${str:0:20}${suffix:+...} 
done 
+0

Dieses und die nächste Lösung funktioniert, aber die Variablen zB: '$ {preset3}' ändern sich nicht. Mit 'bash -x' können Sie sehen, dass die Zeichenfolge abgeschnitten und die Ellipse hinzugefügt wird, aber Sie können sehen, dass der Wert der Variablen nicht aktualisiert wird, wenn Sie dies tun:' echo $ {preset3} '. – vato

+0

@vato Und warum genau möchten Sie das tun? Ändert die Array-Elemente nicht genug? – PesaThe

+0

@vato Beachten Sie, dass Sie Arrays auch direkt mit 'read' verwenden können:' IFS = read -r 'array [0]' '. Sie brauchen überhaupt keine Variablen. Behalten Sie einfach das Array, wenn es für Sie bequemer ist. – PesaThe

1

Sie müssen die array[i] Syntax verwenden, um Array-Elemente zuweisen:

for ((i = 0; i < ${#presets[@]}; ++i)); do 
    x=${presets[i]} 
    if [[ "${#x}" -gt 20 ]]; then 
     y="${x:0:20}..." 
     presets[i]="$y" 
    fi 
done 
Verwandte Themen