Unable

2009-04-24 19 views
-1

Der CodeUnable

#!/usr/bin/awk    

# Sed and AWK by O'Reilly (p.179) 

# Example of what should happen: factorial 5 gives 
# factorial 
# Enter number: 3 
# The factorial of 3 is 6 


BEGIN { 
    printf("Enter number: ") 
} 

$1 ~ /^[0-9]+$/ { 
    # assign value of $1 to number & fact 
    number = $1 
    if (number == 0) 
     fact = 1 
    else 
     fact = number 

    for (x = 1; x < number; x++) 
     fact *=x 
    printf("The factorial of %d is %g\n", number, fact) 

    exit 
} 

# if not a number, prompt again. 
{ printf("\nInvalid entry. Enter a number: ") 
} 

ich den Befehl erfolglos betrieben von

./factorial.awk 

eine Fakultäts-Funktion in AWK machen ich

/usr/bin/awk: syntax error at source line 1 
context is 
     >>> <<< ./factorial.awk 
/usr/bin/awk: bailing out at source line 1 

Was die Fehlermeldung tut bedeuten?

+0

Typ in ' sudo apt-get install gawk 'dann ./factorial.awk –

+0

Ich habe 3.1.5 GAWK im Computer. –

Antwort

4

Ich denke, dass das Problem ist, dass Sie ein Shell-Skript schreiben und es zur Ausführung an awk übergeben. Das Folgende ist ein Shell-Skript, daher die #! /bin/sh, so dass es an die Shell übergeben wird (in diesem Fall Bourne-kompatibel).

Die She-Bang-Zeile (#!) Teilt dem aktuellen Interpreter mit, welcher Interpreter das Skript zur Ausführung übergeben soll.Sie müssen das Skript an den awk Interpreter übergeben, so dass Sie explizit awk aufrufen müssen. Dies setzt voraus, dass awk irgendwo in Ihrem Weg ist.

Das Folgende ist jedoch ein awk Skript.

#! /usr/bin/awk -f 
BEGIN { 
    printf("Hello world!\n"); 
    exit 
} 

Die sie-Knall ruft awk und übergibt das Skript als Eingabe. Sie müssen awk in diesem Fall nicht explizit aufrufen, und Sie müssen nicht das gesamte Skript angeben, da es direkt an awk übergeben wird.

Denken Sie an die She-Bang als sagen nehmen, was folgt die She-Bang, den Namen der Datei anhängen, und führen Sie es. Wikipedia beschreibt die Verwendung ziemlich gut einschließlich einiger gängiger Möglichkeiten, das path to the interpreter Problem zu lösen.

3

Möglicherweise eine dumme Antwort, aber in meinem Terminal würde ich eingeben:

./factorial.awk 

, wo die Datei factorial.awk ist.

Sie könnten Ihre Pfadumgebungsvariable bearbeiten, um sie einzuschließen. aber ./ sollte gut funktionieren, denke ich. Und hinzufügen. $ PATH könnte sich in einigen Situationen, in denen Sie Code ausführen würden, den Sie nicht erwartet haben, als sehr gefährlich erweisen.

Funktioniert das?

EDIT:

./factorial.awk -bash: ./factorial.awk:/usr/bin/gawk: bad interpreter: Keine solche Datei oder das Verzeichnis

, der sagt, dass es das lief Datei aber konnte das Programm nicht finden gawk. Bitte geben Sie "which gawk" und dann "which awk" ein.

Ihre erste Linie sein sollte:

#!/usr/bin/awk 

Auch, mich zu amüsieren zu, geben Sie in:

sudo apt-get install gawk 

, die sicherstellen, werden Sie tatsächlich gaffen auf Ihrem System.

EDIT2: Ich schaute auf Ihren Code und das ist, was ich jetzt habe. Ich habe zwei Anführungszeichen und einen Gedankenstrich entfernt.

#!/usr/bin/gawk                                   

# I think we do not need these (p.179) so I comment them out, since I do not know where else to put them. 
# The same bug occurs also with them. 
#fact = number 
#for (x = number -1 ; x > 1; x--) 
# fact *= x 

awk # factorial: returns factorial of user-supplied number 
    BEGIN { 
    printf("Enter number: ") 
    } 

    $1 ~ /^[0-9]+$/ { 
    # assign value of $1 to number & fact 
    number = $1 
    if (number == 0) 
     fact = 1 
    else 
     fact = number 
    #loop to multiply fact*x until x = 1 
    for (x = number - 1; x > 1; x--) 
     fact *= x 
    printf("The factorial of %d is %g\n", number, fact) 
    #exit -- saves user from typing ^-d 
    exit 
} 

# if not a number, prompt again. 
{ printf("\nInvalid entry. Enter a number: ") 
} 
+0

Ich bekomme folgende Fehler: http://dpaste.com/37585/ –

+0

Ist Ihre erste Zeile korrekt? Bitte beachten Sie die Änderung. –

+1

Das Beispiel von dpaste.com zeigt Ihnen die Verwendung von 'sudo' zum Ausführen von 'chmod'; Das ist eine gefährliche Reihe von Praktiken, in die man eindringen kann. Verschwinde jetzt, bevor du dein System katastrophal brichst. Für Skripte, die Sie schreiben, sollte es nie notwendig sein, sudo zu verwenden, um die Berechtigungen zu ändern. Sie sollten in Ihrer eigenen Region in einer eigenen Datei arbeiten, in der Sie Berechtigungen ändern können, ohne Rootberechtigung zu benötigen. –

2

Prüfen, ob eine Datei vorhanden ist /usr/bin/gawk; Wenn nicht, benutze entweder den Pfad von awk oder den korrekten Ort für gawk.

Haben Sie das Skript auch ausführbar gemacht?

Und haben Sie auch das aktuelle Verzeichnis in Ihrem Pfad?

+0

Der Code ist jetzt 777. Wie kann ich I ob ich das aktuelle Verzeichnis in meinem PATH habe oder nicht? –

+0

Gut, wenn PATH = "/ bin:/usr/bin:.:/Home/me/bin:" und aktuelles Verzeichnis (cwd) =/home/me/bin, dann erscheint cwd 4 mal auf dem Pfad: (1) vor dem ersten Doppelpunkt (2) als Punkt zwischen zwei Doppelpunkten (3) als/home/me/bin (4) nach dem letzten Doppelpunkt. Benutze keine 777 Erlaubnis; niemals Dateien - insbesondere ausführbare Dateien - öffentlich beschreibbar machen; Sorgen Sie sich, ob Mitglieder Ihrer Gruppe auch Schreibrechte haben sollten. (Es könnte schlimmer sein; ich kenne ein Makefile, das perms 7777 setzt (setuid, setgid, sticky bit!) –

+0

Ich setze die Ausgabe von pwd auf meinen PATH. Ich habe jetzt 755 Berechtigungen. Ich erhalte die folgenden Fehlermeldungen http://dpaste.com/37592/ –

1

bekam ich das Skript in Ubuntu und OS X zu arbeiten, indem Sie

awk -f factorial.awk 

Es scheint, dass Sie nicht das Skript ausführen können wie folgt obwohl das Buch so sagt

./factorial.awk 
+1

Sie können es sicher als "./factorial.awk" ausführen. Die Voraussetzungen dafür sind: (1) es ist vom Benutzer ausführbar, also "chmod 0700 factorial.awk", (2) die erste Zeile der Datei ist "#!/Path/to/awk", so dass die Shell ausgeführt wird awk, (3) das Skript wird korrekt in der Shell in Bezug auf den Pfad ausgeführt, so dass "./factorial.awk" funktioniert, und (4) es ist ein gültiges awk-Skript. Das ganze Skript in "awk '..." zu verpacken ist nicht gültig! –

+0

Vielen Dank für Ihre Antworten! –

3

sein kann, es wasn Das ist kompliziert. !

#/usr/bin/awk ---------> #/usr/bin/awk -f

0

Hier ist eine rekursive Version:

#!/usr/bin/awk -f 
function f(x) { 
    if (x <= 1) return 1 
    return (f(x-1) *x)} 

BEGIN { 
    printf("Enter number: ") 
} 

$1 ~ /^[0-9]+$/ { 
    printf("The factorial of %d is %d\n", $1, f($1)) 
    exit 
} 

{ printf("\nInvalid entry. Enter a number: ") 
}