bash 脚本错误

bash 脚本错误

我有以下运行良好的 bash 脚本。

#!/bin/bash

OUTFILE=somefile.txt
(
./runnable input << EOF
2
4
EOF
) > $OUTFILE

但后来我需要改变参数。一个目录中有 100 个文件,每个文件都有两个数字。这两个数字需要输入到上面的脚本中。100 个文件中的数据如下:

2,4
9,2
4,2

因此我将脚本改为如下形式但这似乎不起作用。

#!/bin/bash

OUTFILE=file3.txt
(
while read line
do
./runnable input << EOF

#following gets first number before comma
test=$(echo `expr index "$line" ,` )
echo ${line:0:($test-1)}
line=$(echo ${line:$test})

#following gets second number after comma
test=$(echo `expr index "$line" ,` )
echo ${line:0:($test-1)}
line=$(echo ${line:$test})

EOF
done < file_with_values
) > $OUTFILE

我做错了什么?

答案1

不能在内联数据块 (<< EOF) 内编写脚本

尝试这样的操作:

OUTFILE=file3.txt

while IFS=, read a b; do
    echo "first number: $a"
    echo "second number: $b"

    # you can call runnable here, for example if you want to give it one number at a time:

    echo "$a" | ./runnable input
    echo "$b" | ./runnable input

    # or something like this:

    ./runnable "$a" "$b"

done >$OUTFILE

答案2

尝试通过将您读取的行创建一个数组来轻松地拆分行,如下所示(其中 your_line 是您从文件中读取的行)。

OIFS=${IFS}
IFS=','
your_line=(${your_line})
IFS=${OIFS}

现在 ${your_line[0]} 是第一个数字,${your_line[1]} 是第二个数字。您可以回显它们、添加它们,等等。这可能会正常工作。

整个脚本将会变成类似这样的内容:

#!/bin/bash

cat FILE_WITH_VALUES | while read your_line; do

    OIFS=${IFS}
    IFS=','
    your_line=(${your_line})
    IFS=${OIFS}

    echo ${your_line[0]} ${your_line[1]} | ./runnable_input >> OUTPUT_FILE

done

缺点是这将启动 runnable_input 100 次(每行一次)。在速度相当快的机器上,对于如此小的输入运行 100 次并不重要,除非 runnable_input 依赖于每次获取 100 行。

答案3

将 100 个文件预处理为 1 个数据文件,然后对其进行处理

#!/usr/bin/bash

OUTFILE=xyzzy
(
while read line 
do
./runable $line
done <datafile
)>$OUTFILE

答案4

试试这个脚本,

#!/bin/sh
IFS="
"
for i in $( sed 's|,| |g' file_with_values );
do
    ./runnable $i
done > file3.txt

相关内容