shell脚本中的分组



在向函数传递参数时,如何将参数分组为单个参数?示例

如果我的脚本文件"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 "$@"

相关内容

  • 没有找到相关文章

最新更新