将 BASH 带引号的参数重新传递给函数

Repassing BASH arguments with quotes in to function

如何让函数传递 3 个参数而不是 4 个?在主体脚本中引用参数对我没有帮助。 test.sh 的正文示例:

func1(){
    echo "Func1: Amount arguments: $#, Passed arguments: $@";
    for i in $@; do
        echo "ARG=$i";
    done;
}

echo "Body: Amount arguments: $#, Passed arguments: $@";
func1 $@;

# quoting with single or double quote
res="";
for i in "${@}"; do
    # try to figure out if quoting was required for the $i:
    grep -q "[[:space:]]" <<< "$i" && res="${res} \"${i}\"" || res="${res} ${i}";
done;

echo "Quoted arguments: $res";
func1 $res;

我用下一个参数执行脚本:

bash ./test.sh 1 2 "3 4"

结果:

Body: Amount arguments: 3, Passed arguments: 1 2 3 4
Func1: Amount arguments: 4, Passed arguments: 1 2 3 4
ARG=1
ARG=2
ARG=3
ARG=4
Quoted arguments:  1 2 "3 4"
Func1: Amount arguments: 4, Passed arguments: 1 2 "3 4"
ARG=1
ARG=2
ARG="3
ARG=4"

我想将第三个参数设为“3 4”。怎么做?谢谢。

如果要构建需要引用的参数列表,则必须使用数组。句法引号不嵌套;展开参数时,内部引号被视为文字字符。

res=()
for i in "${@}"; do
    res+=( "$i" )
done

func "${res[@]}"

(当然,如果除了将 i 的值添加到数组中之外,您没有对 i 的值执行任何其他操作,则以上内容等效于 res=( "$@" )。)

您需要在调用函数 func1 和此函数内的循环中引用参数,以便变量扩展不会删除参数中的引号。

#!/bin/bash 

func1(){
echo "Func1: Amount arguments: $#, Passed arguments: $@"
for i in "$@"; do                                                                                                                                                                                                                       
  echo "ARG=$i"
done
}

echo "Body: Amount arguments: $#, Passed arguments: $@"
func1 "$@"

请注意,我已经删除了 ; 和每行的末尾,因为不需要它们。