【发布时间】:2014-01-07 21:51:58
【问题描述】:
我一直在 bash 中努力将参数文件解析并读取到多个 gobal 变量中。我们同时运行 HPUX 和 Linux 环境,我正试图让它在 BASH 中工作。它目前在 sed 语句上给我错误。即使我取出 sed,在循环内它也会读取变量,但是一旦我离开循环,它的值就会恢复为全局定义。已经尝试在文件顶部添加“#!/bin/sh”,但这不像承载的shell,注释代码是从HPUX系统承载的shell。任何帮助将不胜感激!
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`... -
他不是你的
sed -e "s/||/|-|/g" -e "s/||/|-|/g" -e "s/||/|-|/g" -e "s/|/ /g" $StatFile重复中的前3个-es吗?您只需要其中的 1 个,因为您使用的是“g”。哦,当然,将sed ..输入重定向(<)需要进程替换,即。while ... ; done <(sed ....)或者< <(sed ...)。或者移动 sed 通过前面的管道喂食,sed ... | while ...祝你好运。 -
实际上,如果文件没有值,它们就会出现。即便是全球,|||只会由第一个替代者修复,第二个替代者将捕获第二个立即发生的事件。第三个可能是多余的。
-
PERL 会很有趣,但是我们有一个巨大的承载外壳库......我必须编写某种翻译实用程序(无论如何我可能必须为 bash 做这些...... )
标签: bash sed global-variables