从自定义文件读取程序的参数并使用此参数运行该程序

时间:2011-07-08 14:18:48

标签: string bash scripting arguments sh

所有!

我需要从包含如下字符串的文件'data'中读取参数:

-a -camb="1 0.5 1",diff="1 0 0" -q=5
-a -camb="0 1 0" -p -q -f=10
...

接下来,必须将这些参数传递给脚本中的程序./test:

#!/bin/bash

while read line
do
    ./test "$line"
done < "./data"

问题是“$ line”作为argv [1]传递给./test,而不是作为argv [1],argv [2],argv [3]

的序列传递

如何将字符串行拆分为多个参数?即./test必须采用argv [1],argv [2]等等?

注意,-camb =“1 0.5 1”,diff =“1 0 0”必须作为整个参数,argv [2]!

2 个答案:

答案 0 :(得分:2)

您可以使用eval:

#!/bin/bash

while read line
do
    eval "./test $line"
done < "./data"

然而,这里有一个很大的警告:eval可能会对文件内容进行更多的解释。例如,如果它包含任何I / O重定向(例如>somefile),则会应用 。同样,$variable 替换,; somecommand 作为单独的命令等执行。基本上,如果数据文件的内容不是不够干净,你可能会得到一些意想不到的危险结果。

答案 1 :(得分:1)

引号为literal, not syntactic,这意味着它们的处理方式与shell不同。但是你可以通过在数组中设置它们来处理它们:

$ params(){
    for param in "$@"
    do
        echo "$param"
    done
}
$ while IFS= read -r line
do
    declare -a par="($line)"
    params "${par[@]}"
    echo
done < data
-a
-camb=1 0.5 1,diff=1 0 0
-q=5

-a
-camb=0 1 0
-p
-q
-f=10

PS:Don't use eval