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



我正在尝试使用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})

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

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

有趣的变体:

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。它将执行一个完全以空格command blabla命名的文件名。
  • $("git ${command}")中,您要执行一个名为 git commit -m 'test test' 的文件名(确切地说,这是展开后的整个文件名,带空格${command}(。与系统上一样,没有名为git commit -m 'test test' bash 返回命令的文件未找到。

最新更新