执行包含shell变量引号的命令

Mar*_*sch 23 bash shell

我目前在从shell变量执行命令时遇到问题.

通常,以下工作符合预期:

COMMAND="echo A"
echo $COMMAND
$COMMAND
Run Code Online (Sandbox Code Playgroud)

生产:

echo A
A
Run Code Online (Sandbox Code Playgroud)

但如果我这样做

COMMAND="su aUser -s /bin/bash -c 'echo A'"
echo $COMMAND
$COMMAND
Run Code Online (Sandbox Code Playgroud)

我明白了

su aUser -s /bin/bash -c 'echo A'
Password: 
A': -c: line 0: unexpected EOF while looking for matching `''
A': -c: line 1: syntax error: unexpected end of file
Run Code Online (Sandbox Code Playgroud)

如果我进入该行

su aUser -s /bin/bash -c 'echo A'
Run Code Online (Sandbox Code Playgroud)

直接按预期工作.

似乎我的假设是$ COMMAND等于输入内容,因为命令直接是错误的.

问题

1)有谁知道如何从变量运行命令?

2)究竟有什么区别

COMMAND="command"
$COMMAND
Run Code Online (Sandbox Code Playgroud)

command
Run Code Online (Sandbox Code Playgroud)

gle*_*man 33

数组对于保持参数整体非常有用:

command=(su aUser -s /bin/bash -c 'echo A')
Run Code Online (Sandbox Code Playgroud)

并完全像这样调用它:

"${command[@]}"
Run Code Online (Sandbox Code Playgroud)

  • 这比'eval`更好,但它在Bourne Shell中不起作用,只在`bash`中 (2认同)

Igo*_*bin 24

你需要eval.

$ eval $VARIABLE
Run Code Online (Sandbox Code Playgroud)

  • 尽可能避免使用eval,它有可能成为奇怪错误的来源.如果必须使用它,至少要双引号变量(即eval"$ VARIABLE").松散地说,$ VARIABLE在执行之前会执行一些正常解析,但不是全部; eval $ VARIABLE进行一些解析,然后再次解析; eval"$ VARIABLE"只解析一次.但是你最好还是使用@ glenn的答案. (3认同)
  • 好的,有效.任何提示$ COMMAND究竟做了什么以及为什么它与eval不同? (2认同)
  • `eval $VARIABLE` 存在一些错误,可以通过使用 `eval "$VARIABLE"` 来避免。要演示这些错误,请尝试 `VARIABLE=$'printf " - %s\\n" "first line" " * " "third line"'` 并在非空目录中比较两种方式的 `eval`。 (2认同)