我想使用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
,但仍然遇到相同的错误。
答案 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")}'