awk 中的语法错误

awk 中的语法错误
#!/usr/bin/awk

userinput='Hello World!'
userinput=$userinput awk '
    BEGIN {
        s = ENVIRON["userinput"] "\n"
        n = length(s)
        while (1)
            printf "%s", substr(s,int(1+rand()*n),1)
    }'

每当我运行上面的代码时,我都会收到以下错误。

awk:命令。第 1 行:pass.awk
awk:cmd。第 1 行:^ 语法错误

#!/usr/bin/awk

awk '{
        s = $0 "\n"
        n = length(s)
        while (1)
            printf "%s", substr(s,int(1+rand()*n),1)
    }'

awk:命令。第 1 行:pass.awk
awk:cmd。第 1 行:^ 语法错误

我两次都遇到同样的错误。但是,当我编写这些代码并在终端中运行时,我没有收到任何错误。这对我来说有点奇怪。因为,我是新手awk。我不确定这可能是一个打字错误。我已将文件名保存为pass.awk.以此方式运行,awk pass.awk或者,awk pass.awk hello

答案1

这里有两个问题。首先,如果您想编写awk脚本,则需要-f在 shebang 中使用,因为awk需要一个文件,并且使用它是一种解决方法,可以让您使用awk脚本的内容。看man awk

   -f progfile
             Specify  the pathname of the file progfile containing an awk
             program. A pathname of '-' shall denote the standard  input.
             If multiple instances of this option are specified, the con‐
             catenation of the files specified as progfile in  the  order
             specified  shall be the awk program. The awk program can al‐
             ternatively be specified in the command line as a single ar‐
             gument.

因此,要awk在 shebang 中用作解释器,您需要以下内容:

#!/bin/awk -f

BEGIN{print "hello world!"}

您拥有的是一个正在调用的 shell 脚本awk,因此您需要一个 shell shebang:

#!/bin/sh

awk 'BEGIN{ print "Hello world!"}'

下一个问题是您的变量中有空格,但正在使用不带引号的变量。始终在 shell 脚本中引用变量!你想要的是这样的:

userinput='Hello World!'
userinput="$userinput" awk '...

现在,这是您的第一个(shell)脚本的工作版本:

#!/bin/sh

userinput='Hello World!'
userinput="$userinput" awk '
    BEGIN {
        s = ENVIRON["userinput"] "\n"
        n = length(s)
        while (1)
            printf "%s", substr(s,int(1+rand()*n),1)
    }'

请注意,您的while (1)意思是脚本永远不会退出,这是一个无限循环。

这是您的第二个脚本作为实际awk脚本:

#!/usr/bin/awk -f

{
  s = $0 "\n"
  n = length(s)
  while (1)
    printf "%s", substr(s,int(1+rand()*n),1)
}

答案2

让第一行调用 shell 解释器而不是 awk,如

#!/usr/bin/env bash

答案3

默认情况下,awk 期望包含程序代码的字符串作为命令行上的第一个参数。例如

awk 'BEGIN{ print "hello" }'

只会打印hello。所以如果你跑

awk pass.awk

它尝试解释pass.awk为 awk 代码。点不是有效的 awk 语法,因此会出现错误。

要让 awk 从文件中读取代码,请使用awk -f foo.awk,如 @terdon 的答案所示。 (您需要修复 hashbang 行并删除 shell 存根,如图所示。)

相关内容