Awk

awk 中的語法錯誤

  • May 6, 2021
#!/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。line: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。line:1: ^ 語法錯誤

我兩次都遇到同樣的錯誤。但是,當我編寫這些程式碼並在終端中執行時,我沒有收到任何錯誤。這對我來說有點奇怪。因為,我是新手awk。這可能是一個拼寫錯誤,我不確定。我已將文件名保存為pass.awk. 以這種方式執行awk pass.awk,或者,awk pass.awk hello

這裡有兩個問題。首先,如果你想寫一個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)
}

引用自:https://unix.stackexchange.com/questions/648453