BASH脚本:从1行文件读取到多个全局变量

时间:2014-01-07 21:51:59

标签: bash sed global-variables

我一直在用bash来解析并将参数文件读入多个gobal变量。我们运行HPUX和Linux环境,并且我正在尝试在BASH中使用它。它目前在sed语句中给我错误。即使我取出sed,它在循环内部读取变量,但是一旦我离开循环,值就会恢复为全局定义。尝试在文件顶部添加“#!/ bin / sh”,但是这不像borne 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|

2 个答案:

答案 0 :(得分:5)

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

在read和for命令中引用$vars至关重要。

答案 1 :(得分:2)

问题在于while循环通常在自己的子shell中运行。可能最直接的解决方案是将输出保存到临时文件中,然后获取临时文件。

这是一个说明一些解决方案的网页。 fvue.nl wiki page