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

标签 bash shell

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

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

我所追求的功能正是 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

输入.txt:

"hello world" "hello back"

预期结果:

$1: hello world
$2: hello back

观察结果:

$1: "hello
$2: world"

编辑:

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

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

最佳答案

未加引号的变量(如 do_echo $line)在 IFS 变量(默认设置为制表符、空格、换行符)中的任何字符处严格拆分). Strictly 表示非常严格,没有办法引用或逃避 split 。

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

例如

$ 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

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

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

关于bash - 使用带空格的文件中的参数在 bash 脚本中调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12111144/

相关文章:

linux - shell 命令 `ls –z >output.txt` 和 `ls –z 2>output.txt` 之间的区别?

处理可选参数的 bash 脚本

c - TTY 键代码在 "bind -x"bash 回调中更改

linux - 为什么父 bash 等待子 bash 死亡才执行 trap

shell - shell脚本中大括号{}和中括号()的区别

linux - 是否可以创建一个始终以 root 身份启动程序的 shell 脚本?不管是谁在运行它

linux - 逐行比较两个文件并在第二个文件 [linux/java] 中存储唯一数据

bash - Bash if 语句中什么时候需要方括号?

linux - 如何从 bash 脚本修改/etc/environment

bash - 从 shell 脚本中的函数返回值