我一直在努力将参数文件解析并读取到多个 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|
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
在读取命令和 for 命令中不要引用$vars
,这一点至关重要。
问题是 while 循环通常在自己的子 shell 中运行。 可能最直接的解决方案是将输出保存到临时文件中,然后获取临时文件。
下面是一个说明一些解决方案的网页。fvue.nl 维基页面