将多字参数传递给bash函数

hae*_*lix 14 parameters bash split cpu-word

在bash脚本函数中,我需要使用脚本的命令行参数,以及另一个参数列表.所以我试图将两个参数列表传递给一个函数,问题是多字参数被拆分.

function params()
{
    for PARAM in $1; do
        echo "$PARAM"
    done

    echo .

    for ITEM in $2; do
        echo "$ITEM"
    done
}

PARAMS="$@"
ITEMS="x y 'z t'"
params "$PARAMS" "$ITEMS"
Run Code Online (Sandbox Code Playgroud)

调用脚本给了我

myscript.sh a b 'c d'
a
b
c
d
.
x
y
'z
t'
Run Code Online (Sandbox Code Playgroud)

由于有两个列表,它们必须作为一个整体传递给函数,问题是,如何在尊重单引号'cd'和'z t'中包含的多字项时迭代元素?

我有的解决方法(见下文)使用BASH_ARGV,所以我只需要将一个列表传递给该函数.但是,我想更好地了解正在进行的工作以及完成上述工作所需的工作.

function params()
{
    for PARAM in "${BASH_ARGV[@]}"; do
        echo "$PARAM"
    done

    echo .

    for ITEM in "$@"; do
        echo "$ITEM"
    done
}

params x y 'z t'
Run Code Online (Sandbox Code Playgroud)

调用脚本给了我

myscript.sh a b 'c d'
c d
b
a
.
x
y
z t
Run Code Online (Sandbox Code Playgroud)

......我需要的是什么(除了第一个列表被反转,但我认为这是可以容忍的)

Pet*_*r.O 10

function params()
{
   arg=("$@")

   for ((i=1;i<=$1;i++)) ;do
       echo "${arg[i]}"
   done

   echo .

   for ((;i<=$#-$1+2;i++)) ;do
       echo "${arg[i]}"
   done
}

items=(w x 'z t')
params $# "$@" "${items[@]}"
Run Code Online (Sandbox Code Playgroud)

假设您使用args调用脚本a b 'c d',输出为:

a
b
c d
.
x
y
z t
Run Code Online (Sandbox Code Playgroud)