所有!
我需要从包含如下字符串的文件'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]!
答案 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
。