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

And*_*ock 5 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
Run Code Online (Sandbox Code Playgroud)

input.txt:

"hello world" "hello back"
Run Code Online (Sandbox Code Playgroud)

预期结果:

$1: hello world
$2: hello back
Run Code Online (Sandbox Code Playgroud)

观察结果:

$1: "hello
$2: world"
Run Code Online (Sandbox Code Playgroud)

编辑:

我正在使用它通过不同的输入多次执行同一命令。每行最多有15个参数,最多可以有50行。

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

Jo *_* So 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
Run Code Online (Sandbox Code Playgroud)

另一种解决方法是使用evaleval很危险。您绝对必须相信输入!

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