在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 ì 项的数组a
、b
、"c 3"
和 d
5 个项目 a
、b
、"c
、3"
和 d
。我假设您想要前者,我只想指出,如果您遇到这种困惑,您就会陷入困境,这通常意味着您应该能够事先构建一个数组。
所以如果你想要前者,最简单的方法是调用eval args=($args)
,但这是一个非常糟糕的做法,因为它可以根据给出的参数评估恶意代码以上是关于在bash中将包含空格的变量传递给命令[重复]的主要内容,如果未能解决你的问题,请参考以下文章