質問
コード
#!/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: ")
}