Bash 中的右字符串扩展(对于 shell 脚本)

Right string expansion in Bash (for shell script)

我正在使用 shell 脚本进行一些试验,该脚本应该 运行 git 命令用于同一级别的多个存储库。这个项目结构可能是个坏主意,但这是另一回事了。

在我 运行 解决这个问题之前一切正常:

DETAIL="test test" && command="commit -m '${DETAIL}'" && echo $(git ${command})
# -> error: pathspec 'test'' did not match any file(s) known to git.

我也尝试过其他机会,例如

DETAIL="test test" && command="commit -m ${DETAIL}" && echo $(git ${command})
DETAIL="test test" && command="commit -m $DETAIL" && echo $(git ${command})

全部给出相同的结果(见上文)。我还扫描了 these docs 关于字符串扩展的内容,但我没有遇到 variables/strings 可能为空或未定义的问题。最后一个 echo 不是问题,您还可以将 $(git status) 的结果存储在一个变量中并回显这个(我在脚本中的方式)。

我知道,有 similar questions,但我还没有找到类似的情况,因为我只是处理简单的非空字符串,但有(太多?)很多引号。

有趣的变体:

DETAIL="test test" && command="commit -m '${DETAIL}'" && echo $("git ${command}")
# -> git commit -m 'test test': command not found # WHAT?

也很有趣,只是:

command="commit -m 'test'" && echo $(git ${command})

工作正常。

使用 bash 带有适当引号的数组...

DETAIL="test test" && command=(commit -m "$DETAIL") && git "${command[@]}"

您的代码:

  • echo "$(command)"command 相同(好的,删除尾随的空换行符)
  • "command blabla" 不使用第一个参数 blabla 执行文件 command。它将执行一个与 space command blabla.
  • 完全相同的文件名
  • $("git ${command}")里面你要执行一个名为git commit -m 'test test'的文件名(准确的说,这是完整的文件名,spaces,在${command}展开后) .由于在您的系统上没有名为 git commit -m 'test test' bash returns command not found.
  • 的文件