Bash Shell变量中的引号不起作用,为什么?

时间:2013-07-23 15:16:21

标签: bash shell

#!/bin/sh
LOG='log --pretty=format:"%h - %an, %ar : %s"'

git $LOG

我希望这能以指定的格式输出实际的git日志。但是,我得到的只是一个致命的争论错误。

我也尝试过以下选项,它们也不起作用:

LOG="log --pretty=format:\"%h - %an, %ar : %s\""
LOG='log --pretty=format:\"%h - %an, %ar : %s\"'

然而,奇怪的是下面的脚本有效,我不明白为什么:

LOG='--pretty=format:"%h - %an, %ar : %s"'
git log "$LOG"

有人认为shell正在考虑变量只是一个参数,但以下工作正常:

LOG1LINE='log --pretty=oneline'
git $LOG1LINE

2 个答案:

答案 0 :(得分:4)

这是解决此问题的一种方法。使用bash数组:

#!/bin/bash
#It's important to use bash instead of sh for this to work

LOG=(log --pretty=format:"%h - %an, %ar : %s")
git "${LOG[@]}"

答案 1 :(得分:2)

这是shell如何处理参数的产物。

shell做的第一件事是替换变量。此处不保留变量定义中使用的引号。然后根据引号将它们分成参数,如果不存在,则将它们分成单词边界。当他们第一次使用时引用的引用在那时被转义,因此无法定义单词边界。

因此,在第一个示例中传递给git的参数是:

  • log
  • --pretty=format:"%h
  • -
  • %an,
  • %ar
  • :
  • %s"

在后面的示例中,传递给git的参数是:

  • log
  • --pretty=format:"%h - %an, %ar : %s"