2012-10-27 3 views
5

Ich möchte überprüfen, ob die Länge eines Bash-Array gleich einer Bash-Variable (int) ist oder nicht. Mein aktueller Code sieht so aus:Überprüfen, ob die Länge des Arrays gleich einer Variablen in der Bash ist

if [ "${#selected_columns}" -eq "${number_of_columns}" ]; then 
    echo "They are equal!" 
fi 

Dies gibt false zurück, da die echo-Anweisung nie ausgeführt wird. Dies führt jedoch zu 4 für beide:

echo "${#selected_columns[@]}" 
echo "${number_of_columns}" 

Was ist hier falsch? Hat es etwas mit String versus int zu tun?

+5

Vermissen Sie nicht '[@]' im ersten Beispiel? – Junuxx

+0

'if [" $ {# selected_columns [@]} "-eq" $ {number_of_column} "]; dann ' –

+0

Ja, nur ein dummer Tippfehler. Vielen Dank! –

Antwort

5

In Ihrem:

if [ "${#selected_columns}" -eq "${number_of_columns}" ]; then 
    echo "They are equal!" 
fi 

${#selected_columns} ist [@] fehlt.

Korrigiert:

if [ "${#selected_columns[@]}" -eq "${number_of_columns}" ]; then 
    echo "They are equal!" 
fi 
+0

Außer warum hast du nicht einfach mit einer Antwort geantwortet? Bei StackOverflow geht es neben dem ursprünglichen Asker darum, Fragen zum Wohle anderer Leute zu beantworten. Jemand kann die Kommentare unter einer Frage nicht lesen und einfach gehen, ohne etwas Neues zu lernen, nachdem er gesehen hat, dass noch keine Antworten eingereicht wurden. (Ich habe deinen Kommentar verpasst, bis ich halbwegs die Lösung eingegeben habe.) Bewege deinen Kommentar zu einer Antwort und ich werde dich aufstocken, wenn du möchtest. –

+0

Ich denke, Sie fühlen sich stark über dieses Problem: also warum nicht Ihren Kommentar als Antwort posten, werde ich meine eigene Antwort entfernen, wenn das dich glücklich macht? =) –

+0

Nein, du hast schon die Drecksarbeit gemacht. Jetzt ist es einfacher zu sehen, was falsch war;) –

2

bash Manpage nach:

$ {# name [Index]} erweitert auf die Länge von $ {name [Index]}. Wenn der Index * oder @ ist, ist die Erweiterung die Anzahl der Elemente im Array. eine Feldvariable referenzieren ohne Index zur Bezugnahme auf das Array mit einem Index von 0.

Verwenden von ${name} auf Indexarrays führt äquivalent zu ${name[0]}, dann erhielt man die Länge des ${name[0]}, keine Elemente der gesamten Array zählen. Das ist also kein Problem beim Vergleich von String mit Integer. AFAIK, "Integer-Zahl in String" mit "Integer by Let" zu vergleichen, ist im bash-Scripting nie ein Problem.

Verwandte Themen