尝试运行awk可执行文件时出现“bad interpreter”错误消息

时间:2013-04-22 17:17:54

标签: linux awk

我正在尝试制作一个awk文件可执行文件。我写了剧本,做了chmod +x filename。这是代码:

#!/bin/awk -v

'TOPNUM = $1

## pick1 - pick one random number out of y
## main routine

BEGIN {
## set seed
        srand ()

## get a random number

        select = 1 +int(rand() * TOPNUM)

# print pick
        print select
}'

当我尝试运行程序并为TOPNUM添加变量时:

pick1 50

我收到回复:

-bash: /home/petersone/bin/pick1: /bin/awk: bad interpreter: No such file or directory

我确信有一些简单的事情我搞砸了,但我根本无法弄清楚它是什么。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:5)

从命令行运行以下命令:

which awk

这将打印AWK的路径,可能是/usr/bin/awk。纠正第一行,你的脚本应该有效。

此外,您的脚本不应在开头和结尾包含单引号字符。您可以从命令行运行AWK并将脚本作为带引号的字符串传入,或者您可以在文件中编写脚本并使用#!/usr/bin/awk第一行,命令就在文件中。

此外,您的脚本的第一行无法正常工作。在AWK中,设置代码需要位于BEGIN块内,而$1是对输入行中第一个字的引用。您需要使用ARGV[1]来引用第一个参数。

http://www.gnu.org/software/gawk/manual/html_node/ARGC-and-ARGV.html

正如@TrueY指出的那样,第一行应该有一个-f

#!/usr/bin/awk -f

此处讨论:Invoking a script, which has an awk shebang, with parameters (vars)

该程序的工作,测试版本:

#!/usr/bin/awk -f

## pick1 - pick one random number out of y
## main routine
BEGIN {
    TOPNUM = ARGV[1]

## set seed
        srand ()

## get a random number

        select = 1 +int(rand() * TOPNUM)

# print pick
        print select
}

答案 1 :(得分:3)

实际上这种形式更受欢迎:

#! /bin/awk -E 

男人告诉:

  

-E与-f类似,但是,这是最后一个处理选项,应该与#一起使用!脚本,特别是对于CGI应用程序,以避免从URL传递命令行中的选项或源代码(!)。此选项禁用命令行变量赋值