2016-11-03 76 views
0

*我以前問過一個問題,但這不是正確的問題。現在我提出了正確的問題並修復了示例代碼。我會提出一個答案,其中部分地回答了上一個問題。 *我可以將默認值分配給bash中的數組嗎?

我想默認值在bash到陣列。請看下面,

function chmod_chown_func() { 
    local file_path="$1" 
    local chmod_options[2]=${2:='-R 744'} # This line has error. 
    local chown_options[2]=${3:='-R root:root'} # This line has error. 
    sudo chmod "${chmod_options[@]}" "${file_path}" 
    sudo chown "${chown_options[@]}" "${file_path}" 
} 

chmod_chown_func "test.txt" 

的錯誤消息是

$2: cannot assign in this way 

非常感謝你。

回答

1

參數擴展

是,膨脹${a:=default}改變的a值。
它在bash手冊中被稱爲"Assign Default Values"

$ unset a 
$ echo "<${a}> and <${a:=default}>, But <${a}>" 
<> and <default>, But <default> 

但是該語法不能應用於位置參數。
位置參數可以是(大部分)與set改變。

$ echo "[email protected]" 
a b c 
$ set -- d e f 
$ echo "[email protected]" 
d e f 

但是可以使用的"Use default value"作爲稱爲手冊中的擴展:

$ unset a 
$ echo "<${a}> and <${a:-default}>, But <${a}>" 
<> and <default>, But <> 

要分配值(S)到一個數組變量。

一個常見的成語是

$ array=(aaa bbb ccc) 
$ echo "${array[1]}" 
bbb 

或者:

$ declare -a array=(aaa bbb ccc) 

這也會使局部變量的函數,如果函數內部使用。

然而,它帶有細節通配符(*?[])將被擴展(除非引用或選項set -f被使用)。

總的來說,這是更好地使用read

$ IFS=' ' read -a array <<<"$a" 

數組索引

你不能使用一個索引分配整個陣列。這:

chmod_options[2]=${2:-'-R 744'} 

只會造成一個陣列值,在指數2.一種更好的方式將是:

chmod_options=(${2:--R 744}) 

或者,如上所述:

IFS=' ' read -a chmod_options <<<"${2:--R 744}" 
+0

謝謝你告訴詳細和更好的答案關於使用默認值的數組初始化。 – mora

2

的follwings是錯誤點和一個答案代碼。

錯誤1: 由$缺省值{變量:=「一些值」}不與位置參數工作。 它應該是$ {variable: - 'some value'}

錯誤2: 要爲數組指定默認值,請聲明一個數組併爲其指定一個默認數組值。

一例答案代碼以下

function chmod_chown_func() { 
    local file_path="$1" 
    local -a chmod_options=${2:-(-R 744)} 
    local -a chown_options=${3:-(-R root:root)} 
    sudo chmod "${chmod_options[@]}" "${file_path}" 
    sudo chown "${chown_options[@]}" "${file_path}" 
} 
相關問題