3

将参数传递给函数时,如何将参数分组为单个参数?例子

如果我的脚本文件“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
4

4 回答 4

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.sha b c d作为单个参数获取时,echo_arguments 将每个字母作为单独的参数获取。通常,解决此问题的最佳方法是将 $1 放在双引号中以防止它被重新拆分(并防止其他一些可能不受欢迎的杂散解析):

echo_arguments "$1"

作为一般规则,每当你替换一个变量时,你应该用双引号把它包起来,以防止你看到的那种问题。有些情况下您需要额外的解析,所以您不想要双引号;但除非您有特定的理由希望 shell 进行额外的解析,否则请使用双引号来避免麻烦。

对于您的具体示例,“修复”此问题的另一种方法是让 echo_arguments 回显其所有参数,而不仅仅是第一个:

echo_arguments() {
    echo "$@"
} 

请注意,它"$@"扩展到所有当前脚本/函数的参数,每个参数都被视为它们被传递给的命令/函数的单独参数(本质上,它们被完整地传递)。

于 2012-11-21T22:02:46.850 回答
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

于 2012-11-21T20:22:02.853 回答
0

我不知道它是否合适,但您可以尝试在 bash 中使用“var args”:

echo_arguments() {
 echo ${@:1:4}
}

echo_arguments ${@:1:4}

这将扩展前 4 个参数。

于 2012-11-21T20:25:05.013 回答
0

如果您希望它们成为脚本中的单个参数,则将它们放在引号中(单引号或双引号):

./my_script.sh 'a b c d'

相反,如果您希望将它们作为单独的参数进行解析,但您希望将脚本的所有参数传递给其中的函数,则可以使用$@来一​​次引用所有这些参数。

echo_arguments() {
    echo "$@"
} 
echo_arguments "$@"
于 2012-11-21T20:27:06.793 回答