【问题标题】:passing variable containing space to command in bash [duplicate]在bash中将包含空格的变量传递给命令[重复]
【发布时间】: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


【解决方案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),但这是一个非常糟糕的做法,因为它可以根据给出的参数评估恶意代码
猜你喜欢
  • 2014-10-06
  • 2017-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-22
  • 2015-01-08
  • 2015-02-15
相关资源
最近更新 更多