用函数中的引号重用BASH参数

时间:2017-05-29 13:24:52

标签: bash function arguments quotes

如何使函数传递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”。怎么做?谢谢。

2 个答案:

答案 0 :(得分:0)

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

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

func "${res[@]}"

(如果您没有使用res=( "$@" )的值做任何其他事情,除非将其添加到数组中,否则上述内容相当于i。)

答案 1 :(得分:0)

您需要引用函数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 "$@"

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