在向函数传递参数时,如何将参数分组为单个参数?示例
如果我的脚本文件"my_script.sh"具有类似的函数
echo_arguments() {
echo $1
}
echo_arguments $1
现在在unix命令行中,如何将参数指定为单个参数?
./my_spcript.sh a b c d #these "a b c d" must fit in $1
您可以通过多种方式将多个单词组合为一个参数:
./my_spcript.sh 'a b c d'
./my_spcript.sh "a b c d"
./my_spcript.sh a b c d
基本上,它们都可以归结为告诉shell将空间视为参数的一部分,而不是参数之间的分隔符。以上所有操作都是在将$1设置为a b c d
,并且未设置$2、$3等的情况下运行脚本。
然而,当你在没有报价的情况下扩展1美元时,就像这样:
echo_arguments $1
shell扩展$1,然后将其重新编译,将空间视为参数之间的分隔符。因此,当my_spccript.sh将a b c d
作为单个参数时,echo_arguments将每个字母作为单独的参数。通常,解决这个问题的最佳方法是将$1放在双引号中,以防止它被重新拆分(并防止其他可能不受欢迎的杂散解析):
echo_arguments "$1"
一般来说,无论何时替换变量,都应该用双引号将其括起来,以防止出现问题。在某些情况下,需要附加解析,因此不需要双引号;但是,除非您有特定的理由希望shell进行额外的解析,否则使用双引号可以省去麻烦。
对于您的特定示例,另一种"修复"此问题的方法是使echo_arguments回显其所有参数,而不仅仅是第一个:
echo_arguments() {
echo "$@"
}
请注意,"$@"
扩展到当前脚本/函数的所有参数,每个参数都被视为要传递到的命令/函数的单独参数(本质上,它们是完整传递的)。
用引号包围参数将允许参数中有空格,即./my_spcript.sh 'a b c d'
。您需要在脚本中再次执行同样的操作:
# my_script.sh
echo_arguments() {
echo $1
}
echo_arguments "$1"
正如其他人所提到的,$@(和$*)提供了将所有命令行参数作为一个组引用的其他方法。看见http://tldp.org/LDP/abs/html/internalvariables.html例如Bash中的详细信息。
我不知道它是否合适,但您可以尝试在bash:中使用"var-args">
echo_arguments() {
echo ${@:1:4}
}
echo_arguments ${@:1:4}
这将扩展前4个参数。
如果您希望这些参数是脚本中的单个参数,则用引号(单引号或双引号)传递它们:
./my_script.sh 'a b c d'
相反,如果希望将它们解析为单独的参数,但希望将脚本中的所有参数传递给脚本中的函数,则可以使用$@
一次引用所有参数。
echo_arguments() {
echo "$@"
}
echo_arguments "$@"