2016-11-03 78 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}" 
} 
相关问题