bash 如何切换传递给函数的初始参数

Dav*_*ave 2 arrays parameters bash function

我想向 bash 中的函数发送多个参数。我怎样才能做到这一点,以便函数正确解析每个参数?

如果可能的话希望避免使用eval。

这是我尝试使用的代码。

#!/bin/bash

arr_files=(
test_file
test_file1
test_file2
)

user=user10
group=user10

cp_chmod_chown(){
    # $1 = chmod value
    # $2 = chown value
    # $3 = array of files

    chmod_value=$1
    shift
    chown_value=$2
    shift
    arr=("$@")
 
    for i in "${arr[@]}"; do
        echo arr value: $i
    done
    echo chmod_value: $chmod_value
    echo chown_value: $chown_value

}

cp_chmod_chown "644" "$user:$group" "${arr_files[@]}"


Run Code Online (Sandbox Code Playgroud)

但是,我无法正确移出前两个参数,因此参数在数组中混杂在一起。这是运行上述脚本后的输出,您可以看到chown_value由于某种原因是数组中的第一个值:

# ./cp_arra_chmod_chown.sh

arr value: test_file
arr value: test_file1
arr value: test_file2
chmod_value: 644
chown_value: test_file

Run Code Online (Sandbox Code Playgroud)

我尝试将参数以不同的顺序放置,并使用引号和不使用引号,我尝试过的似乎都不起作用。如何将多个参数传递给函数?

Bru*_*uno 6

之后shift,所有值都会发生变化。下一个代码是错误的,因为在first之后shift,前者$2变成$1:

chmod_value="$1"
shift
chown_value="$2"
shift
Run Code Online (Sandbox Code Playgroud)

你应该写:

chmod_value="$1"
shift
chown_value="$1"
shift
Run Code Online (Sandbox Code Playgroud)

或者,如果您愿意:

chmod_value="$1"
chown_value="$2"
shift 2
Run Code Online (Sandbox Code Playgroud)