使用带空格的文件中的参数调用bash脚本中的函数

时间:2012-08-24 14:16:36

标签: bash shell

我想执行一个带有从文件读入的参数的命令。 这样可以正常工作,直到其中一个参数需要有空格。

我尝试用引号和反斜杠对单词进行分组,但两者都没有用。

我所追求的功能正是xargs所做的,除了我需要调用函数而不是命令,因为它依赖于在脚本中其他地方设置的其他变量

脚本:

do_echo() {
    echo '$1:' $1
    echo '$2:' $2
}
line=`cat input.txt` #cat used for simplicity, can have more than 1 line
do_echo $line

input.txt中:

"hello world" "hello back"

预期结果:

$1: hello world
$2: hello back

观察结果:

$1: "hello
$2: world"

编辑:

我使用它来使用不同的输入多次执行相同的命令。 每行最多有15个参数,可能超过50行。

表格格式是理想的,尽管将每个参数放在一行上的当前答案都可行。

2 个答案:

答案 0 :(得分:4)

不加引号的变量(如do_echo $line中)严格分割在IFS变量中的任何字符(默认情况下设置为制表符,空格,换行符)。严格意味着严格来说,没有办法引用或逃避分裂。

基本的解决方法是将一个不需要的字符(例如冒号:)定义为拆分字符。

例如

$ cat input.txt
hello world:hello back
$ line=$(head -n 1 input.txt)
$ OLDIFS=$IFS IFS=:
$ do_echo $line
$1: hello world
$2: hello back
$ IFS=$OLDIFS

另一种解决方法是使用eval,但eval是危险的。你绝对必须相信输入!

$ cat input.txt
"hello world" "hello back"
$ line=$(head -n 1 input.txt)
$ eval do_echo "$line"
$1: hello world
$2: hello back

答案 1 :(得分:3)

不使用引号,而是使用保证的字符分隔每个参数 不出现在个人论点中。例如,使用分号:

hello world;hello back
argument 1;argument 2

然后,您可以使用read

一次读取一组参数,一次一批
while IFS=';' read -a arguments; do
    do_echo "${arguments[@]}"
done < input.txt

一个模糊的ASCII控制字符,如单位分隔符(ASCII 0x1f),如果你可以在你的文件中输入它,就不太可能出现在参数中。