Arhn - архитектура программирования

Сценарий BASH: чтение из однострочного файла в несколько глобальных переменных

Я изо всех сил пытался в bash проанализировать и прочитать файл параметров в несколько глобальных переменных. Мы запускаем среды HPUX и Linux, и я пытаюсь заставить это работать в BASH. В настоящее время он дает мне ошибку в инструкции sed. Даже когда я вынимаю sed, внутри цикла он считывает переменную (переменные), но значения возвращаются к глобальному определению, как только я выхожу из цикла. Пробовали добавить «#!/bin/sh» вверху файла, но это не работает, как оболочка, код с комментариями взят из оболочки из системы HPUX. Любая помощь будет оценена по достоинству!

set -xv

ReadStat() {
set -xv

while read EngName AllTabs Distribs DropDist BlockSet BlockExp BlockBy MaxProcs ; do
   echo "read: EngName=$EngName AllTabs=$AllTabs Distribs=$Distribs DropDist=$DropDist BlockSet=$BlockSet BlockExp=$BlockExp BlockBy=$BlockBy MaxProcs=$MaxProcs "
done < sed -e "s/||/|-|/g" -e "s/||/|-|/g" -e "s/||/|-|/g" -e "s/|/ /g" $StatFile 

#cat $StatFile |\
#  sed -e "s/||/|-|/g" -e "s/||/|-|/g" -e "s/||/|-|/g" |\
#  sed -e "s/|/ /g" |\
#  read EngName AllTabs Distribs DropDist BlockSet BlockExp BlockBy MaxProcs

}

# main() {


BaseNameIs=`basename $0 '.sh'`

StatFile=/tmp/kz.stat

EngName="it1xxx"
CronJob='Y'
Distribs='B'
DropDist='N'
AllTabs='N'
BlockSet='N'
# BlockExp=`date '+%Y%m%d%H%M'`
BlockExp=`date '+%Y%m%d'`'0000'
BlockBy='none'
MaxProcs=30

MyHost=`hostname`

ReadStat 

# main() }

Входной файл выглядит так:

it1xxx|Y|B|N|Y|201401071110|none|30|

  • Есть ли шанс, что вы захотите пропустить BASH и использовать Perl? split сотворил бы чудеса с такой остротой... my ($EngName,$CronJob,$Distribs,$DropDist,$AllTabs,$BlockSet,$BlockExp,$BlockBy,$MaxProcs,$MyHost)=split('|', $lineIn); $MyHost=defined($MyHost)?$MyHost:`hostname`... 08.01.2014
  • Разве он не первые 3 -e в ваших sed -e "s/||/|-|/g" -e "s/||/|-|/g" -e "s/||/|-|/g" -e "s/|/ /g" $StatFile дубликатах? вам нужен только 1 из них, потому что вы используете «g». Да, и, конечно же, подача sed .. в перенаправление (<) потребует подстановки процесса, т.е. while ... ; done <(sed ....) или, может быть, < <(sed ...). ИЛИ переместите sed, чтобы направить время через трубу спереди, sed ... | while ... Удачи. 08.01.2014
  • на самом деле они присутствуют в случае, если файл не имеет значений. Даже с глобальным, ||| будет зафиксировано только первой заменой, вторая замена уловит второе непосредственное появление. Третий, наверное, лишний. 08.01.2014
  • PERL был бы интересен, но у нас есть огромная библиотека встроенных оболочек... Мне пришлось бы написать какую-то утилиту перевода (что мне, возможно, придется сделать для bash в любом случае....) 08.01.2014

Ответы:


1

Команда bash read может справиться с этим:

vars="EngName AllTabs Distribs DropDist BlockSet BlockExp BlockBy MaxProcs"
IFS='|' read -r $vars dummy < kz.stat
for var in $vars; do echo "$var = ${!var}"; done
EngName = it1xxx
AllTabs = Y
Distribs = B
DropDist = N
BlockSet = Y
BlockExp = 201401071110
BlockBy = none
MaxProcs = 30

Крайне важно не заключать $vars в кавычки как в командах чтения, так и в командах for.

07.01.2014
  • отлично. Сегодня совсем забыл о трюке с IFS. Однако вам нужно использовать eval вместо echo, чтобы установить переменные для дальнейшего использования. 08.01.2014
  • Не нужно eval нигде. Эхо должно просто продемонстрировать, что переменные были правильно установлены командой чтения. 08.01.2014

  • 2

    Проблема в том, что циклы while обычно выполняются в своей собственной подоболочке. Вероятно, наиболее простым решением является сохранение вывода во временный файл, а затем источник временного файла.

    Вот веб-страница, которая иллюстрирует некоторые решения. вики-страница fvue.nl

    07.01.2014
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..