bash
  • shell
  • 2013-07-23 36 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

    相關問題