BASH脚本条件语句问题

时间:2013-12-10 22:30:29

标签: bash shell conditional-statements

我正在尝试使用Bash脚本使用名为uvspec的基于终端的程序运行大量计算(仅超过200万)。但是,在计算的最新成绩之后,我遇到了严重障碍......

该脚本打开一个输入文件,其中包含2e ^ 6行,如下所示:

0 66.3426 -9.999 -9999
0 66.6192 -9.999 -9999
0 61.9212 1.655 1655
0 61.9999 1.655 1655
...

这些值中的每一个代表我想要替换到输入文件中的不同值(使用 sed ),因此我将每行读入数组。这些行中的许多行在第4列中包含负值,例如-9999,这会导致程序出错,所以我想省略那些行并返回一个标准输出 - 我用if语句做这个...问题是我的输出中出现了一个非常错误的问题我m 99.9%确定问题是以下脚本中的错误,因为我对bash相当新。

任何人都可以在这里发现任何没有意义或语法错误的内容吗?

对脚本的任何评论一般也都是有用的反馈。

cat ".../Maps/dniinput" | while IFS=$' ' read -r -a myArray
do  
if [ "${myArray[3]}" -gt 0 ]
    then
      sed s/TAU/"${myArray[0]}"/ x.template x.template > a.template
      sed s/SZA/"${myArray[1]}"/ a.template a.template > b.template
      sed s/ALT/"${myArray[2]}"/ b.template b.template > x.inp
       ../bin/uvspec < x.inp >> dni.out

 else
     echo "0 -9999" >> dnijul.out
 fi 
done

2 个答案:

答案 0 :(得分:2)

Sed可以一次完成所有三个替换,您可以将输出直接输入到分析程序中,而无需创建任何中间的a.template和b.template文件......

sed -e "s/.../.../" -e "s/.../.../" -e "s/.../.../" x.template | ../bin/uvspec

顺便说一句,你也可以在开始时摆脱“cat”,并用你的名字更符合它们的变量替换你的数组,如果你使用这样的循环:

while IFS=S' ' read tau sza alt p4
do
   echo $tau $sza $alt $p4
done < a
0 66.3426 -9.999 -9999
0 66.6192 -9.999 -9999
0 61.9212 1.655 1655
0 61.9999 1.655 1655

我将第四个元素命名为“p4”,因为您将第四个元素称为注释中的高度,但在您的代码中,您将第三列替换为“ALT” - 所以我不确定您的参数是什么是的,但你应该从上面的例子中得到这个想法。

答案 1 :(得分:0)

您可能希望将这些“sed”行组合成更像:

 sed -e "s/TAU/${myArray[0]}/" -e "s/SZA/${myArray[1]}/" \
     -e "s/ALT/${myArray[2]}/" < x.template \
   | ../bin/uvspec >> dni.out