【问题标题】:BASH script: Reading from 1-line file into multiple global variablesBASH 脚本:从 1 行文件中读取多个全局变量
【发布时间】: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 .. 输入重定向(&lt;)需要进程替换,即。 while ... ; done &lt;(sed ....) 或者 &lt; &lt;(sed ...)。或者移动 sed 通过前面的管道喂食,sed ... | while ... 祝你好运。
  • 实际上,如果文件没有值,它们就会出现。即便是全球,|||只会由第一个替代者修复,第二个替代者将捕获第二个立即发生的事件。第三个可能是多余的。
  • PERL 会很有趣,但是我们有一个巨大的承载外壳库......我必须编写某种翻译实用程序(无论如何我可能必须为 bash 做这些...... )

标签: bash sed global-variables


【解决方案1】:

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 至关重要。

【讨论】:

  • 不错。今天完全忘记了 IFS 技巧。您需要 eval 而不是 echo 来设置变量以供进一步使用。
  • 在任何地方都不需要 eval。 echo 只是为了证明变量已经被 read 命令正确设置了。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2021-08-01
    • 1970-01-01
    • 2019-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多