Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 函数的有条件使用?_Bash - Fatal编程技术网

Bash 函数的有条件使用?

Bash 函数的有条件使用?,bash,Bash,我创建了一个bash脚本,它将ASCII文件解析为逗号分隔的输出。效果很好。现在,这些文件的新文件布局正在逐步引入 我的脚本现在有两个解析函数(每个布局一个),我想根据ASCII文件头中的特定标记调用它们。脚本的结构如下: #!/bin/bash function parseNewfile() {...parse stuff...return stuff...} function parseOldfile() {...parse stuff...return stuff...} #loop

我创建了一个bash脚本,它将ASCII文件解析为逗号分隔的输出。效果很好。现在,这些文件的新文件布局正在逐步引入

我的脚本现在有两个解析函数(每个布局一个),我想根据ASCII文件头中的特定标记调用它们。脚本的结构如下:

#!/bin/bash

function parseNewfile() {...parse stuff...return stuff...}
function parseOldfile() {...parse stuff...return stuff...}

#loop thru ASCII files array
i=0
while [ $i -lt $len ]; do
    #check if file contains marker for new layout
        grep CSVHeaderBox output_$i.ASC
        #calls parsing function based on exit code
        if [ $? -eq 0 ]
        then
        CXD=`parseNewfile`
        else
        CXD=`parseOldfile`
        fi

    echo ${array[$i]}| awk -v cxd=`echo $CXD` ....
        let i++
done>>${outdir}/outfile.csv
...
脚本没有出错。它总是调用原始函数“parseOldfile”,并忽略新函数。即使我专门为脚本提供了几个具有新布局的文件

我想做的事情似乎很琐碎。我错过了什么

编辑:新旧文件布局的示例

1) 旧文件布局

F779250B
=====BOX INFORMATION=====
Model         = R15-100
Man Date      = 07/17/2002
BIST Version  = 3.77
SW Version    = 0x122D
SW Name       = v1b1645
HW Version    = 1.1
Receiver ID   = 00089787556

=====DISK INFORMATION=====
....
F779250B
=====BOX INFORMATION=====
Model         = HR22-100
Man Date      = 07/17/2008
BIST Version  = 7.55
SW Version    = 0x066D
SW Name       = v18m1fgu
HW Version    = 2.3
Receiver ID   = 028910170936

CSVHeaderBox:Platform,ManufactureDate,BISTVersion,SWVersion,SWName,HWRevision,RID
CSVValuesBox:HR22-100,20080717,7.55,0x66D,v18m1fgu,2.3,028910170936

=====DISK INFORMATION=====
....
2) 新文件布局

F779250B
=====BOX INFORMATION=====
Model         = R15-100
Man Date      = 07/17/2002
BIST Version  = 3.77
SW Version    = 0x122D
SW Name       = v1b1645
HW Version    = 1.1
Receiver ID   = 00089787556

=====DISK INFORMATION=====
....
F779250B
=====BOX INFORMATION=====
Model         = HR22-100
Man Date      = 07/17/2008
BIST Version  = 7.55
SW Version    = 0x066D
SW Name       = v18m1fgu
HW Version    = 2.3
Receiver ID   = 028910170936

CSVHeaderBox:Platform,ManufactureDate,BISTVersion,SWVersion,SWName,HWRevision,RID
CSVValuesBox:HR22-100,20080717,7.55,0x66D,v18m1fgu,2.3,028910170936

=====DISK INFORMATION=====
....

我不确定这是否满足OP的要求。
如果你的函数知道如何解析文件,
awk
需要什么

#/bin/bash

function f1() {
    echo "f1() says $@"
}

function f2() {
    echo "f2() says $@"
}

FUN="f1"
${FUN} "foo"
FUN="f2"
${FUN} "bar"

我不确定这是否满足OP的要求。
如果你的函数知道如何解析文件,
awk
需要什么

#/bin/bash

function f1() {
    echo "f1() says $@"
}

function f2() {
    echo "f2() says $@"
}

FUN="f1"
${FUN} "foo"
FUN="f2"
${FUN} "bar"

这可能无法解决您的问题,但可能会提高性能:而不是

    grep CSVHeaderBox output_$i.ASC
    #calls parsing function based on exit code
    if [ $? -eq 0 ]
使用

qrep-q将在第一次匹配时成功退出,因此它不必扫描整个文件。另外,你不必为美元而烦恼?变种

不要这样做:

awk -v cxd=`echo $CXD`
这样做:

awk -v cxd="$CXD"

这可能无法解决您的问题,但可能会提高性能:而不是

    grep CSVHeaderBox output_$i.ASC
    #calls parsing function based on exit code
    if [ $? -eq 0 ]
使用

qrep-q将在第一次匹配时成功退出,因此它不必扫描整个文件。另外,你不必为美元而烦恼?变种

不要这样做:

awk -v cxd=`echo $CXD`
这样做:

awk -v cxd="$CXD"

我写这篇文章有点不好意思,但我解决了我的“问题”

在gedit(我在Ubuntu上)在“尾随空格”问题上犯了几十次错误后,我将代码复制并粘贴到一个新文件中,然后重新运行脚本

成功了

我无法解释原因


感谢大家花时间写这篇文章。

我有点不好意思,但我解决了我的“问题”

在gedit(我在Ubuntu上)在“尾随空格”问题上犯了几十次错误后,我将代码复制并粘贴到一个新文件中,然后重新运行脚本

成功了

我无法解释原因


感谢大家抽出时间。

您需要提供一个可复制的示例。grep+if用于一个简单的示例。
grep
似乎在文件
output\u$i.ASC
中找不到字符串
CSVHeaderBox
。显示这样一个文件的示例内容。您在输出中看到了
CSVHeaderBox
吗?您需要将
-q
-s
添加到grep的选项中。@AnsgarWiechers:我将在我的原始帖子中提供一个。准备。你需要提供一个可复制的例子。grep+if用于一个简单的示例。
grep
似乎在文件
output\u$i.ASC
中找不到字符串
CSVHeaderBox
。显示这样一个文件的示例内容。您在输出中看到了
CSVHeaderBox
吗?您需要将
-q
-s
添加到grep的选项中。@AnsgarWiechers:我将在我的原始帖子中提供一个。Stand by.Awk用于在将函数输出写入我的CSV文件之前清理该函数的输出。Awk用于在将函数输出写入我的CSV文件之前清理该函数的输出。