我有以下运行良好的 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