Bash:逐行读取一个文件,并将每个段作为参数处理到其他进程

我有一些肮脏的工作要做,所以一个Bash脚本似乎是一个不错的选择。我对Bash很新,而且这种经历使我感到很沮丧。

文件mapfiles.txt由以下行组成。每行有四个段用白色空格分开。每个段代表外部程序名’prog’的输入参数。例如,“cm19_1.png”是文件名,“0001”的索引,“121422481”的经度,“31035995”的纬度。

文件:mapfiles.txt

cm19_1.png 0001 121422481 31035995
cm19_2.png 0002 121423224 31035995
cm19_3.png 0003 121423967 31035995
…

我想对每行执行类似的命令。如下所示,prog的输入参数顺序略有不同。所以编写一个bash脚本来处理重复的工作是有意义的。

[Usage] prog <index> <longitude> <latitude> <filename>
example: prog 0001 121422481 31035995 cm19_1.png

通常,bash脚本将以这种方式运行:

>从mapfiles.txt读一行
>拆分细分
>使用正确的参数顺序调用prog

这里是run.sh.

#!/bin/sh

input=mapfiles.txt
cmd=prog

while read line
do
        file=$(echo $line | cut -d' ' -f1)
        key=$(echo $line | cut -d' ' -f2)
        log=$(echo $line | cut -d' ' -f3)
        lat=$(echo $line | cut -d' ' -f4)
        echo $cmd $key $log $lat $file
done < "$input"

我预期的是

prog 0001 121422481 31035995 cm19_1.png
prog 0002 121423224 31035995 cm19_2.png
prog 0003 121423967 31035995 cm19_3.png
…

我得到的实际结果是

cm19_1.png21422481 31035995
 cm19_2.png21423224 31035995
 cm19_3.png21423967 31035995

困惑我的问题

>’prog’在哪里?
>白色空间在哪里?
>参数顺序有什么问题?

嗯…我在Mac上使用vim写了这个脚本,并将其复制到Scientific Linux框和gentoo框。这三个人得到了同样可笑的输出。

你可以简化这个很多:
while read file key log lat
do
  echo $cmd $key $log $lat $file
done < "$input"

相关文章

用的openwrt路由器,家里宽带申请了动态公网ip,为了方便把2...
#!/bin/bashcommand1&command2&wait从Shell脚本并行...
1.先查出MAMP下面集成的PHP版本cd/Applications/MAMP/bin/ph...
1、先输入locale-a,查看一下现在已安装的语言2、若不存在如...
BashPerlTclsyntaxdiff1.进制数表示Languagebinaryoctalhexa...
正常安装了k8s后,使用kubect工具后接的命令不能直接tab补全...