将 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 "$@"
请注意,我已经删除了 ;
和每行的末尾,因为不需要它们。
如何让函数传递 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 "$@"
请注意,我已经删除了 ;
和每行的末尾,因为不需要它们。