如何使函数传递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”。怎么做?谢谢。
答案 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 "$@"
请注意,我已删除;
和每行的结尾,因为不需要它们。