2016-04-24 3 views
4

Nach Advanced Bash-Scripting Guide,Bedeutet "untypisiert" dasselbe wie "dynamisch tippen"?

  1. bash Variablen sind nicht typisiert:

    Im Gegensatz zu vielen anderen Programmiersprachen Bash nicht seine Variablen trennen von "Art." Im Wesentlichen sind Bash-Variablen Zeichen Zeichenfolgen, aber je nach Kontext erlaubt Bash arithmetische Operationen und Vergleiche auf Variablen. Der bestimmende Faktor ist , ob der Wert einer Variablen nur Ziffern enthält.

    Die Verbindung gibt auch Beispiele.

    Bedeutet "untypisiert" dasselbe wie das Konzept der "dynamischen Eingabe" in Programmiersprachen? Wenn nicht, was sind die Beziehungen und Unterschiede zwischen den beiden?

  2. Um die Last der Verfolgung von Variablentypen in einem Skript aufhellen, tut Bash Genehmigung declaring Variablen.

    Beispielsweise deklarieren Sie eine Variable als Integer-Typ, indem Sie declare -i myvariable.

    Wird dies "typisierte" Variablen genannt? Bedeutet "typisiert" das gleiche wie das Konzept "statisch tippen"?

+1

Das ist eigentlich eine wirklich interessante Frage, bitte nicht schließen Ich habe daraus gelernt, auch nachdem ich die anderen Antworten gelesen habe. – Harry

+1

Es ist ein wenig unklar, ob 'declare -i' tatsächlich irgendeine Vorstellung von Typ liefert, schon allein deshalb, weil es so wenige Orte gibt, an denen eine Unterscheidung gemacht werden könnte. Die Zuweisung zu einer Variablen mit ihrer ganzzahligen Attributmenge ist betroffen, aber nirgendwo anders ist die * Verwendung * einer solchen Variablen von einer Variablen ohne die Attributmenge unterscheidbar. – chepner

Antwort

3

dieser meisten gut hier ...

Does "untyped" also mean "dynamically typed" in the academic CS world?

von mindestens zwei Personen beantwortet wurde, die mit der Materie vertraut sind. Für die meisten von uns, die Typsysteme usw. nicht auf dieser Ebene studiert haben, bedeutet "untypisiert" dynamische Typisierung, aber es ist in akademischen Kreisen eine falsche Bezeichnung, siehe Beitrag oben. untyped bedeutet eigentlich, dass es keine Typen gibt, dh denke Assembly, Bash wird getippt, es ermittelt seine Typen zur Laufzeit. Lets nehmen Sie den folgenden Satz aus dem Advanced Bash Scripting Guide, Hervorhebung von mir ...

http://tldp.org/LDP/abs/html/untyped.html

Im Gegensatz zu vielen anderen Sprachen der Programmierung ist Bash nicht seine Variablen durch entmischen "Typ." Im Wesentlichen sind Bash-Variablen Zeichen Zeichenketten, aber je nach Kontext erlaubt Bash arithmetische Operationen und Vergleiche auf Variablen. Der entscheidende Faktor ist, ob der Wert einer Variablen nur Ziffern enthält.

Bash findet heraus, dass etwas zur Laufzeit eine Zahl ist, dh es wird dynamisch typisiert. In Assembler auf einer 64-Bit-Maschine kann ich alle 8 Bytes in einem Register speichern und dekrementieren, es überprüft nicht, ob die Dinge Zeichen usw. waren, gibt es keine context über die Sache, die es dekrementieren wird dekrementiert nur die 64 Bits, es überprüft oder berechnet nichts über die Art der Sache, die es dekrementiert.

Perl ist keine untypisierten Sprache, aber der folgende Code könnte es, wie es alles behandelt machen scheinen, als ganze Zahlen, dh

#!/usr/bin/perl 
use strict; 
use warnings; 
my $foo = "1"; 
my $bar = $foo + 1; 
print("$bar\n"); 

$ foo String, sondern wurde erhöht zugewiesen wurde? Bedeutet das, dass Perl nicht typisiert ist, weil es basierend auf dem Kontext das tut, was Sie wollen? Ich denke nicht.

Dieses von Python unterscheidet, Python werden Sie tatsächlich den folgenden Fehler geben, wenn Sie die gleiche Sache versuchen ...

Traceback (most recent call last): 
    File "py.py", line 2, in <module> 
    bar = foo + 1 

Wenn Python dynamisch typisiert ist und Perl wird getippt dynamisch warum sehen wir ein anderes Verhalten. Liegt es daran, dass sich ihre Typsysteme unterscheiden oder ihre Typumwandlungssemantik sich unterscheidet? Gibt es in Assembly Anweisungen zur Typkonvertierung, die eine Zeichenfolge in eine Ganzzahl ändern oder umgekehrt?

Bash hat verschiedene Arten Konvertierungsregeln

#!/bin/bash 
set -e 
MYVAR=WTF 
let "MYVAR+=1" 
echo "MYVAR == $MYVAR"; 

Dies wird 1 zuweisen, anstatt myvar es also zu inkrementieren, wenn Sie eine Zeichenfolge bash erhöhen legt die Zeichenfolge auf ganzzahlige Null dann die Schrittweite der Fall ist. Es führt eine Typumwandlung durch, was bedeutet, dass es getippt ist.

Für alle glauben immer noch, dass Bash nicht typisiert ist dies versuchen ....

#!/bin/bash 
declare -i var1=1 
var1=2367.1 

Sie sollten etwas wie diese erhalten ...

foo.sh: line 3: 2367.1: syntax error: invalid arithmetic operator (error token is ".1") 

Aber die folgenden zeigt keine solche Fehler

Der Ausgang der folgenden

#!/bin/bash 
var1=2367.1 
echo "$var1" 
let "var1+=1" 
echo "$var1" 

ist die gleiche Warnung, ohne eine Art erklärt ...

2367.1 
foo.sh: line 4: let: 2367.1: syntax error: invalid arithmetic operator (error token is ".1") 
2367.1 

Ein viel besseres Beispiel dieser

#!/bin/bash 
arg1=1234 
arg2=abc 

if [ $arg1 -eq $arg2 ]; then 
    echo "wtf"; 
fi 

ist, warum ich dies zu tun bekommen ...

foo.sh: line 5: [: abc: integer expression expected 

Bash fragt mich nach einem ganzzahligen Ausdruck.

+3

Ich stimme dieser Antwort nicht zu. Bash ist * nicht * getippt. Es gibt nur Zeichenfolgen, und Sie können sowohl Zeichenfolgen als auch arithmetische Operationen ausführen. Im Gegensatz dazu wird Python dynamisch typisiert. Es unterscheidet zwischen '1' die ganze Zahl und '' 1 '' die Zeichenkette und Sie können keine Arithmetik an '" 1 "' durchführen. –

+0

@JohnKugelman Ich habe gerade ein Update hinzugefügt, das helfen könnte. Danke für den Kommentar nach dem Downvote, es ist wirklich erfrischend, ein anständiges Feedback zu haben, das helfen könnte, die Antwort oder mein Verständnis des Problems zu verbessern. – Harry

+0

Ich stimme immer noch nicht zu. Bash ist nicht typisiert, nicht dynamisch typisiert. Alles in Ihrer Antwort ist, was es untypisiert macht. Die Tatsache, dass Sie 'WTF' zuweisen und dann inkrementieren können und Bash sich nicht beschweren, ist ein perfektes Beispiel dafür, ** untypisiert ** zu sein. Wenn es in irgendeiner Weise getippt würde, sei es dynamisch oder statisch, würde das nicht funktionieren. –

-1

Bash ist eine dynamisch typisierte oder korrektere, es ist eine dynamisch überprüfte Sprache. Ich habe bereits eine lange Antwort hinzugefügt, das ist die kurze Antwort.

#!/bin/bash 
arg1=1234 
arg2=abc 

if [ $arg1 -eq $arg2 ]; then 
    echo "wtf"; 
fi 

gibt diese Fehlermeldung ....

foo.sh: line 5: [: abc: integer expression expected 

Die Tatsache, dass ich einen Fehler haben, der mir sagt, ich in irgendeiner Art und Weise haben, bedeutet einen Fehler hinsichtlich Art gemacht etwas Arten überprüft.

+1

Wenn 'bash' dynamisch typisiert würde, würde * * -eq' nicht benötigt; es könnte aus den Argumenten schließen, wenn '=' einen String- oder Integer-Vergleich durchführen soll. – chepner

+0

Danke, Harry. Ich habe Ihre Antworten aktualisiert. – Tim

Verwandte Themen