質問

コード

 #!/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: ")
 }

コマンドを実行すると失敗します

./factorial.awk

分かりました

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

エラーメッセージは何を意味しますか?

役に立ちましたか?

解決

問題は、シェルスクリプトを作成し、それを実行のためにawkに渡していることだと思います。以下はシェルスクリプトです。 #! /bin/sh, そのため、シェル (この場合は Bourne 互換) に渡されます。

#! /bin/sh
awk 'BEGIN { printf("Hello world!\n"); exit }'

she-bang (#!) 行は、現在のインタプリタに、実行のためにスクリプトを渡すインタプリタを指示します。スクリプトをに渡す必要があります。 awk 通訳があるので電話する必要があります awk 明示的に。これは次のことを前提としています awk あなたの道のどこかにいます。

ただし、次のことは、 awk 脚本。

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

シーバンが呼び起こす awk そしてスクリプトを入力として渡します。明示的に呼び出す必要はありません awk この場合、スクリプト全体が直接渡されるため、スクリプト全体を引用する必要はありません。 awk.

シーバンはこう言っていると考えてください。 she-bang に続くものを取得し、ファイル名を追加して実行します。. ウィキペディア を解決するための一般的な方法を含め、使用法を非常によく説明しています。 通訳者へのパス 問題。

他のヒント

おそらくダムの答えが、私の端末で、私は入力する必要があります。

./factorial.awk

ファイルはfactorial.awkです。

あなたは含めるようにPATH環境変数を編集することができます。しかし、私は考えてうまく./動作するはずです。そして、付け加えました。の$ PATHにあなたがに期待していなかったのコードを実行しますいくつかの状況では非常に危険であることを証明することができます。

んので仕事??

EDITます:

./ factorial.awk -bash:./factorial.awkします。/ usr / bin / gawkの:悪い通訳:そのようなファイルやディレクトリはありません。

それはそれは、ファイルを実行したが、プログラムのgawkを見つけることができなかったと述べています。 「awkはその」し、「gawkはその」で入力してください。

することになってあなたの最初の行です。

#!/usr/bin/awk

また、ちょうど私を楽しませるために、入力します:

sudo apt-get install gawk

それはあなたが実際にあなたのシステム上でのgawkを持っていることを確認します。

EDIT2: 私はあなたのコードを見ていたし、これは私が今持っているものです。私は2つの引用符やダッシュを削除します。

#!/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: ")
}

それは複雑ではありませんでしたかもしれません。

#!は/ usr / binに/ awkは--------->#!は/ usr / binに/ awkは-f

ファイル/usr/bin/gawkがあるかどうかを確認してください。ない場合は、AWKのパスまたはgawkのための正しい位置のいずれかを使用します。

また、スクリプトを実行可能にしたのですか?

そしてまた、あなたはあなたのPATHに現在のディレクトリを持っているのですか?

私は、スクリプトが

を実行してUbuntuとOS Xで動作するようになりました
awk -f factorial.awk

次のように本がそう言うものの、このスクリプトを実行することができないようです。

./factorial.awk 

ここでは、再帰バージョンです

#!/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: ")
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top