bash: Что пытается сделать последовательность ниже? - PullRequest
0 голосов
/ 17 января 2020

Я пытаюсь использовать пару сценариев bash, которые должны отображать некоторые данные с помощью инструмента iperf3. Я нашел упомянутые скрипты в GIT хранилище нескольких лет. У меня есть эта последовательность:

...
echo \$data \<\<EOD
for j in *.json
do
  dt=$(basename "$j" .json)
  if jq -e '.error' < $j
  then
    echo $(readlink -f $j) has an error, skipping >&2
    cat $j >&2
    continue
  fi
  sent=$(jq '.end.sum_sent.bits_per_second / 8' < "$j")
  received=$(jq '.end.sum_received.bits_per_second / 8' < "$j")
  echo "$dt" "$sent" "$received"
done
echo EOD
....

Я понимаю, что здесь код пытается создать heredo c файл, содержащий for ... done l oop и сохранить в переменной с именем "data «результат его исполнения. Однако это не работает, и bash помечает следующую ошибку:

$data <<EOD
^
line 0: invalid command

Итак, у меня есть несколько вопросов:

  1. Этот синтаксис должен работать и, если да, почему это не так в моем случае?
  2. Признавая, что приведенный выше синтаксис не должен работать и что скрипт, который я нашел, каким-то образом поврежден, как я могу переписать его так, чтобы сохранить в переменных данных Результат выполнения данного здесь c?

Заранее большое спасибо,

Николас ДУМИНИЛ

Я обновляю пост со всей код:

#!/bin/bash
# Grateful for the answers on http://stackoverflow.com/questions/34447348
shopt -s nullglob

echo \$data \<\<EOD
for j in *.json
do
  dt=$(basename "$j" .json)
  if jq -e '.error' < $j
  then
    echo $(readlink -f $j) has an error, skipping >&2
    cat $j >&2
    continue
  fi
  sent=$(jq '.end.sum_sent.bits_per_second / 8' < "$j")
  received=$(jq '.end.sum_received.bits_per_second / 8' < "$j")
  echo "$dt" "$sent" "$received"
done
echo EOD

cat << END
set term svg size 800,600 fname "Helvetica Neue" fsize 9 rounded dashed
set title "Generated by https://github.com/kaihendry/iperf3chart"
set style data histogram
set style histogram cluster gap 1
set style fill solid border -1
set boxwidth 0.9
set xtic rotate by -45 scale 0 font ",8"
set key top left
# Convert bytes to megabytes
set format y '%.0s %cB'
plot \$data using 2:xticlabels(strftime("%H:%M %Y-%m-%d",column(1))) t 'up', '' u 3 t 'down'
END

1 Ответ

0 голосов
/ 21 января 2020

Я отвечаю на свой вопрос. Приведенный выше фрагмент кода работает, как и ожидалось, как только будет выполнен с bash 4. С уважением, Николас

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...