use*_*886 2 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() }
Run Code Online (Sandbox Code Playgroud)
输入文件如下:
it1xxx|Y|B|N|Y|201401071110|none|30|
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
EngName = it1xxx
AllTabs = Y
Distribs = B
DropDist = N
BlockSet = Y
BlockExp = 201401071110
BlockBy = none
MaxProcs = 30
Run Code Online (Sandbox Code Playgroud)
在read和for命令中都不引用是至关重要的$vars.