Я пытаюсь проанализировать и прочитать файл параметров в нескольких глобальных переменных. Мы запускаем среды 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|
Любой шанс, что вы хотите пропустить BASH и использовать Perl? «Разделение» будет делать чудеса на одном слое, таком как ... my ($ EngName, $ CronJob, $ Distribs, $ DropDist, $ AllTabs, $ BlockSet, $ BlockExp, $ BlockBy, $ MaxProcs, $ MyHost) = split ('|', $ lineIn); $ MyHost = defined ($ MyHost)? $ MyHost: \ 'hostname \' '... – abiessu
Не первый ли он 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
Фактически, они присутствуют в случае, если файл не имеет значений. Даже с глобальным, ||| будет зафиксирован только первым заместителем, второй заменитель поймает второе мгновенное появление. Третий, вероятно, лишний. – user3170886