2014-01-07 2 views
2

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

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| 
+1

Любой шанс, что вы хотите пропустить BASH и использовать Perl? «Разделение» будет делать чудеса на одном слое, таком как ... my ($ EngName, $ CronJob, $ Distribs, $ DropDist, $ AllTabs, $ BlockSet, $ BlockExp, $ BlockBy, $ MaxProcs, $ MyHost) = split ('|', $ lineIn); $ MyHost = defined ($ MyHost)? $ MyHost: \ 'hostname \' '... – abiessu

+1

Не первый ли он 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 ... | в то время как ... «Удачи. – shellter

+0

Фактически, они присутствуют в случае, если файл не имеет значений. Даже с глобальным, ||| будет зафиксирован только первым заместителем, второй заменитель поймает второе мгновенное появление. Третий, вероятно, лишний. – user3170886

ответ

2

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

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

1
#! /bin/sh 

vars=("x" "b") 

input_file=`mktemp` 

echo 'foo|bar|' >> $input_file 

Read() { 
    cnt=`cat foo | sed 's/[^|]//g' | wc -c` 
    cnt=$((cnt - 1)) # because the trailing "|" 

    for i in `seq 1 $cnt`; do 
     j=$(($i - 1)) 
     eval "${vars[$j]}=`cat $input_file | cut -f $i -d "|"`" 
    done 

} 

Read 

echo $x 
echo $b 
+0

Спасибо всем! Первый вариант с IFS работал достаточно хорошо! vars = ("EngName AllTabs распределяет DropDist BlockSet BlockExp BlockBy MaxProcs") ReadStat() { IFS = '|' read -r $ vars dummy <$ StatFile } – user3170886

5

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 в обоих чтения и для команд.

+0

nice. Сегодня Totaly забыл об уловке IFS. Вам нужно eval вместо echo, чтобы установить переменные для дальнейшего использования. – yaccz

+0

Ничего не нужно для eval. Эхо просто демонстрирует, что переменные были правильно настроены командой чтения. –

Смежные вопросы