在shell脚本中分组

时间:2012-11-21 20:12:17

标签: bash shell sh

在将参数传递给函数时,如何将参数分组到单个参数中? 示例

如果我的脚本文件“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 个答案:

答案 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 "$@"