shell中使用awk调用函数时出现问题

时间:2019-03-30 07:33:00

标签: bash shell awk

我想使用awk调用randnum函数来生成0和100之间的随机数。脚本ab.sh如下:

#!/bin/bash

function randnum(){
  num=$(($RANDOM%$1))
  echo $num
}
export -f randnum

num=$(randnum 101)
echo $num

awk '
BEGIN{
  cnt=0;
  while(cnt<5){
    "randnum 101"|getline
    print $1
    cnt++
  }
}
'

但是当我运行./ab.sh时,出现以下错误:

7
/bin/sh: 1: randnum: not found





数字7是由awk外部的函数调用生成的。但是当函数在awk内部调用时,找不到randnum

为什么会这样?我尝试bash ab.sh,但仍然遇到相同的错误。

2 个答案:

答案 0 :(得分:3)

Awk不是Bash,它是一种离散的编程语言。您不能从awk调用bash函数,无论如何也不能那样。而是使用awk has为您提供的服务:

awk -v seed=$RANDOM '      # seed from the shell as opposed to time based
BEGIN{
  cnt=0
  srand(seed)              # seed used with srand
  while(cnt<5){
    print int(rand()*101)  # and get a random
    cnt++
  }
}'
98
0
84
100
54

更新

现在是星期六,我无所事事,我开始尝试在bash中创建和导出函数,从GNU awk的ENVIRON[]中提取函数,然后使用函数定义和对bash的调用来调用bash它:

创建函数并export

$ function randnum() {  num=$(($RANDOM%$1));  echo $num; }
$ export -f randnum

测试:

$ randnum 101
1

awk:

$ awk -v fun=randnum -v val=101 '
BEGIN {
    if(fun=="" || val=="")                                    # require values
        exit                                                  # or die
    bash_func="function " fun ENVIRON["BASH_FUNC_" fun "%%"]  # function from ENVIRON
    # print bash_func                                         # DEBUG
    cmd="bash -c \047" bash_func";" fun " " val "\47"         # form bash call
    # print cmd                                               # DEBUG
    ret=((cmd | getline line)>0?line:-1)                      # call it
    print ret                                                 # output
}'
2

答案 1 :(得分:2)

玩转:

#!/bin/bash

function randnum {
  num=$(($RANDOM%$1))
  echo "$num"
}

if [[ $# -ne 0 ]]; then "$@"; exit; fi

awk -v script="$0" 'BEGIN{system(script " randnum 101")}'