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

时间:2019-02-12 08:21:36

标签: bash shell expansion

我正在尝试一些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关于字符串扩展的信息,但是我没有问题,变量/字符串可能为null或未定义。最后一个echo没问题,您也可以将$(git status)的结果存储在一个变量中,并对此进行回显(在脚本中以我的方式)。

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

有趣的变体:

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})

工作正常。

1 个答案:

答案 0 :(得分:2)

使用带有正确引号的bash数组...

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

输入您的代码:

  • echo "$(command)"command相同(好的,删除了尾随的空换行符)
  • "command blabla"不执行带有第一个参数command的文件blabla。它将执行一个完全以空格command blabla命名的文件名。
  • 您要在$("git ${command}")内部执行名为git commit -m 'test test'的文件名(确切地说,这是扩展${command}后的整个文件名,带空格)。在您的系统上,找不到名为git commit -m 'test test'的文件bash返回命令。