代码

 #!/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 }'

她的爆炸(#!) 线告诉前解释其口译员传递的脚本中执行。你必须通过剧本的 awk 翻译所以你需要电话 awk 明确。这个假设 awk 是在你的道路的地方。

以下,但是,是 awk 脚本。

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

她邦调用 awk 并将脚本输入。你不需要明确地援引 awk 在这种情况下你没有引述的整个剧本,因为它是直接通到 awk.

想想她-爆炸的话说 拿什么跟她-邦、追加的名称文件,并执行它. 维基百科 介绍了使用情况很好,其中包括一些共同的方法来解决 路径来解释 问题。

其他提示

可能地一个哑的答案,但在我的终端我将不得不输入:

./factorial.awk

,其中文件是factorial.awk。

您可以编辑PATH环境变量,包括。但./应该工作得很好,我认为。和添加。到$ PATH可以证明是在某些情况下非常危险的地方,你会运行的代码,你没有想到。

这是否工作??

编辑:

./ factorial.awk -bash:./factorial.awk:在/ usr / bin中/ GAWK:坏解释器:没有这样的文件或目录

这是说,它运行该文件,但无法找到该程序GAWK。 请输入“其中呆子”,然后“其中的awk”。

是您的第一行应该是:

#!/usr/bin/awk

另外,只是逗我,输入:

sudo apt-get install gawk

这将确保你确实有GAWK您的系统上。

EDIT2: 我接过来一看你的代码,这就是我现在有。我除去两个引号和破折号。

#!/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 /斌/ AWK --------->#!/ USR /斌/ 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