在bash中将包含空格的变量传递给命令[重复]

Posted

技术标签:

【中文标题】在bash中将包含空格的变量传递给命令[重复]【英文标题】:passing variable containing space to command in bash [duplicate] 【发布时间】:2021-03-20 16:12:36 【问题描述】:

我有一个接收一些选项的程序,如下所示:

root@machine:~$ cat notmodifiable
#!/bin/bash

echo 1: $1
echo 2: $2
echo 3: $3
echo 4: $4

我有一个脚本可以将变量作为参数列表传递给这个程序,下面的脚本演示了逻辑:

root@machine:~$ cat myscript
#!/bin/bash

args='a b "c 3" d'
./notmodifiable $args

执行此脚本时,我得到:

root@machine:~$ ./myscript
1: a
2: b
3: "c
4: 3"

我想要的是:

1: a
2: b
3: c 3
4: d

我无法修改不可修改的脚本(它实际上是一个ELF二进制文件),如何通过修改“myscript”来实现?

【问题讨论】:

不要那样做,bash 中的变量是标量值。对于多个值,使用数组 这能回答你的问题吗? Why does shell ignore quoting characters in arguments passed to it through variables? 【参考方案1】:

使用arrays。

#!/bin/bash

args=(a b "c 3" d)
./notmodifiable "$args[@]"

引用[@] 是传递参数的关键。

如果您省略引号,例如./notmodifiable $args[@] 你也会遇到同样的问题。

如果您使用[*] 而不是[@],例如./notmodifiable "$args[*]" 您将发送一个连接整个数组的参数。

【讨论】:

谢谢,如何将 'a b "c 3" d' 之类的字符串转换为 (a b "c 3" d) 的数组? 如果此时您有一个固定的字符串,您需要选择是否需要一个包含 4 ì 项的数组 ab"c 3"d 5 个项目 ab"c3"d。我假设您想要前者,我只想指出,如果您遇到这种困惑,您就会陷入困境,这通常意味着您应该能够事先构建一个数组。 所以如果你想要前者,最简单的方法是调用eval args=($args),但这是一个非常糟糕的做法,因为它可以根据给出的参数评估恶意代码

以上是关于在bash中将包含空格的变量传递给命令[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在bash中将空格替换为新行[重复]

如何在Python中将变量传递给bash命令

如何将curl的输出捕获到bash中的变量[重复]

在Bash中将字符串拆分为多个变量[重复]

Makefile将变量传递给bash脚本

如何使用for循环将文本文件中的一行字符串作为Bash中另一个脚本的单独变量传递[重复]