#!/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 存根,如图所示。)