bash
  • shell
  • 2013-07-23 34 views 2 likes 
    2
    #!/bin/sh 
    LOG='log --pretty=format:"%h - %an, %ar : %s"' 
    
    git $LOG 
    

    我希望这会以指定的格式输出实际的git日志。但是,我得到的只是一个致命的参数错误。Bash Shell变量中的引号不起作用,为什么?

    我也曾尝试下面的选项,他们也不起作用:

    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" 
    

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

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

    [我想在一个变量把一个命令,但是复杂的情况下总是失败(http://mywiki.wooledge.org/BashFAQ/050) –

    回答

    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[@]}" 
    
    +0

    当我尝试声明数组时,我得到了“Syntax error:”(“unexpected”),即使我使用'declare -a LOG =(b)'也可以得到它。 – onlywei

    +0

    您确定使用bash吗? – anubhava

    +0

    I使用Ubuntu附带的默认终端,我该如何检查? – onlywei

    2

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

    shell做的第一件事是替换变量。这里没有保存在变量定义中使用的引号。然后根据引号或者如果这些不存在的话将它们分成基于边界的论据。当他们第一次使用时被引用的引号在那个时候被转义,因此不能定义字的边界。

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

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

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

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

    LOG ='日志--pretty = oneline' 虽然有效。 – onlywei

    +0

    编辑修复此问题。 – Taymon

    +0

    有什么方法可以保留引号吗? – onlywei

    相关问题