在将参数传递给函数时,如何将参数分组到单个参数中? 示例
如果我的脚本文件“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
答案 0 :(得分:2)
您可以通过多种方式将多个单词分组到一个参数中:
./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_spcript.sh将a b c d
作为单个参数时,echo_arguments将每个字母作为单独的参数。通常,解决这个问题的最好方法是将1美元放在双引号中以防止它被重新拆分(并防止其他一些可能不受欢迎的杂散解析):
echo_arguments "$1"
作为一般规则,每当你替换一个变量时,你应该用双引号将它包起来,以防止你遇到的那种问题。有些情况下你想要额外的解析,所以你不想要双引号;但除非你有一个特定的理由希望shell进行额外的解析,否则使用双引号来保存头痛。
对于您的具体示例,另一种“修复”此方法的方法是使echo_arguments回显其所有的参数,而不仅仅是第一个:
echo_arguments() {
echo "$@"
}
请注意,"$@"
扩展到所有当前脚本/函数的参数,每个参数都被视为它们传递给它们的命令/函数的单独参数(实际上,它们是完整传递的)。
答案 1 :(得分:1)
用引号括住参数将允许参数中的空格 - 即./my_spcript.sh 'a b c d'
。您需要在脚本中再次执行相同的操作:
# my_script.sh
echo_arguments() {
echo $1
}
echo_arguments "$1"
正如其他人所提到的,$ @(和$ *)提供了将所有命令行参数作为一个组引用的其他方法。有关Bash中的详细信息,请参阅http://tldp.org/LDP/abs/html/internalvariables.html。
答案 2 :(得分:0)
我不知道它是否合适,但您可以尝试在bash中使用“var args”:
echo_arguments() {
echo ${@:1:4}
}
echo_arguments ${@:1:4}
这将扩展前4个参数。
答案 3 :(得分:0)
如果你希望这些是脚本中的单个参数,那么用引号(单引号或双引号)传递它们:
./my_script.sh 'a b c d'
相反,如果您希望将它们解析为单独的参数,但是您希望将脚本的所有参数传递给其中的函数,则可以使用$@
来引用它们中的所有参数。一次。
echo_arguments() {
echo "$@"
}
echo_arguments "$@"