2017-03-13 1 views
1

Das Skript:

#!/bin/bash  
declare -a arr=() 
echo ${#arr[@]:-} 

schlägt auf Arch Linux (bash 4.4.5):

-bash: ${#arr[@]:-}: bad substitution 

Während es auf Ubuntu 14.04 (bash 4.3.11) oder Debian 8 (4.3.30) arbeitet .

+3

Diese Ersetzung ... macht eigentlich * Sinn * nicht. Warum würdest du erwarten, dass es überhaupt funktioniert? (Und klar sein - wenn etwas nicht dokumentiert ist, um zu funktionieren, dann ist es kein Fehler mehr, in der Zukunft zu arbeiten, sondern nur eine Veränderung im undefinierten Verhalten). –

+0

(Eine Array-Länge kann niemals leer oder null sein, daher ist "Standard leer" nicht sinnvoll). –

+0

Die andere Sache ist, dass das git-Repository für bash eigentlich keine Granularität auf ChangeSet-Ebene hat - Chet macht jedes Mal ein neues Commit, wenn er ein neues Release veröffentlicht, also gibt es nicht genug Informationen, um "X zu ändern" , die mit der Commit-Nachricht Y als Antwort auf den Bug Z gemacht wurde, verursachte dieses Delta im Verhalten ". –

Antwort

5

In valid_array_reference Funktion in arrayfunc.c wurde die folgende Kontrolle hinzugefügt:

if (t[len+1] != '\0') 
    return 0; 

Somit wird die Expansion nun an der erwarteten Stelle enden validiert, während der zuvor für ungültig/unerwartete Inhalte nach dem Subskript ignoriert .


Dies ist für 05.06 im CWRU/Changelog-Eintrag wie folgt dokumentiert:

arrayfunc.c

  • valid_array_reference: Stellen Sie sicher, dass die Array-Referenz nach dem ersten beendet richtig ist Index; Rückkehr ungültig, wenn etwas nach Abschluss gibt es ]

Insbesondere valid_array_reference von subst.c in valid_length_expression genannt wird -, die als Vorläufer für parameter_brace_expand_length genannt wird, die tatsächlich die Substitution an der Hand führt.

Verwandte Themen