* 我之前问过一个问题,但这不是正确的问题。现在我提出了正确的问题并修复了示例代码。我将提出一个答案,其中部分引用了上一个问题的答案。*
我想在 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"
Run Code Online (Sandbox Code Playgroud)
错误信息是
$2: cannot assign in this way
Run Code Online (Sandbox Code Playgroud)
非常感谢。
小智 2
是的,扩展${a:=default}改变了 的值a。它在 bash 手册中
被称为。"Assign Default Values"
$ unset a
$ echo "<${a}> and <${a:=default}>, But <${a}>"
<> and <default>, But <default>
Run Code Online (Sandbox Code Playgroud)
但该语法不能应用于位置参数。
位置参数(大部分)可以通过 进行更改set。
$ echo "$@"
a b c
$ set -- d e f
$ echo "$@"
d e f
Run Code Online (Sandbox Code Playgroud)
"Use default value"但是您可以使用手册中调用的扩展:
$ unset a
$ echo "<${a}> and <${a:-default}>, But <${a}>"
<> and <default>, But <>
Run Code Online (Sandbox Code Playgroud)
一个常见的习语是
$ array=( aaa bbb ccc )
$ echo "${array[1]}"
bbb
Run Code Online (Sandbox Code Playgroud)
或者:
$ declare -a array=( aaa bbb ccc )
Run Code Online (Sandbox Code Playgroud)
如果在函数内部使用,这也将使变量成为函数的局部变量。
*但是,它附带了通配符( 、?和)将被扩展的详细信息[](除非引用或set -f使用该选项)。
总的来说,最好使用read:
$ IFS=' ' read -a array <<<"$a"
Run Code Online (Sandbox Code Playgroud)
您不能使用一个索引来分配整个数组。这:
chmod_options[2]=${2:-'-R 744'}
Run Code Online (Sandbox Code Playgroud)
只会在索引 2 处创建一个数组值。更好的方法是:
chmod_options=( ${2:--R 744} )
Run Code Online (Sandbox Code Playgroud)
或者,如上所述:
IFS=' ' read -a chmod_options <<<"${2:--R 744}"
Run Code Online (Sandbox Code Playgroud)