2017-05-28 50 views
1

目前在以下版本的Bash裏面工作:製作的命令行參數複製功能

GNU bash, version 4.2.46(1)-release (x86_64-redhat-linux-gnu) 

我當前的腳本:

#!/usr/bin/env bash 

function main() { 
    local [email protected] 
    for command in ${commands[@]} ; do 
    echo "command arg: $command" 
    done 
} 

if [[ "${BASH_SOURCE[0]}" == "$0" ]]; then 
    set -e 
    main [email protected] 
fi 

簡單來說,該腳本只能EXEC main如果它是被調用的腳本,類似於Python的if __name__ == '__main__'約定。

main功能,我只是遍歷所有命令的變量,但如預期報價轉義是不會發生:

$ tests/simple /bin/bash -c 'echo true' 
command arg: /bin/bash 
command arg: -c 
command arg: echo 
command arg: true 

最後一個參數這裏應​​該被Bash得到解析爲一個參數,但它被分成單獨的單詞。

我在做什麼錯?我想echo true顯示爲一個單一的參數。

回答

2

你會得到正確的輸出,除了'echo true'部分正在分詞。你需要在你的代碼中使用雙引號:

main "[email protected]" 

而且在功能:

function main() { 
    local commands=("[email protected]") # need() and double quotes here 
    for command in "${commands[@]}" ; do 
    echo "command arg: $command" 
    done 
} 

功能獲得的[email protected]自己的副本,因此你並不真的需要做一個本地副本的。

有了這些變化,我們得到如下的輸出:

command arg: /bin/bash 
command arg: -c 
command arg: echo true 

在一般情況下,這是不好的存儲在一個變量的shell命令。請參閱BashFAQ/050

參見:

0

你可能會希望做一些更是這樣的:

function main() { 
    while [ $# -gt 0 ] 
    do 
     echo "$1" 
     shift 
    done 
} 

main /bin/bash -c "echo true" 

的關鍵真的是$#,其計數的數量命令行參數(不包括調用名稱$0)。環境變量$#自動設置爲命令行參數的數量。如果函數/腳本調用以下命令行:

$ main /bin/bash -c "echo true" 

$#將具有值「3」的論點:「/斌/慶典」,「-c」和「回聲真」。最後一個算作一個參數,因爲它們被括在引號內。

  1. shift命令將所有命令行參數「移位」到左邊一個位置。
  2. 最左邊的參數丟失(main)。
0

@傳遞給main的引用是你的問題,但我想我會提到你也不需要在main內部賦值來使用它。您可以執行以下操作:

main() 
{ 
    for command 
    do 
    ... 
    done 
} 

main "[email protected]"