проблема при использовании функции вызова awk в оболочке - PullRequest
0 голосов
/ 30 марта 2019

Я хочу использовать 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 ]

3 голосов
/ 30 марта 2019

Awk - это не Bash, это дискретный язык программирования.Вы не можете вызывать функции bash из awk, ну, во всяком случае, не так.Вместо этого используйте то, что awk имеет , чтобы предложить вам:

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, извлекая ее из ENVIRON[] в GNU awk и вызывая bash с определением функции и обращаясь к ней:

Создайте функцию и export ее:

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

Проверьте это:

$ randnum 101
1

The 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
2 голосов
/ 30 марта 2019

Чтобы поиграть с:

#!/bin/bash

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

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

awk -v script="$0" 'BEGIN{system(script " randnum 101")}'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...