为什么此bash函数仅打印整个字符串的第一个单词?

我正在尝试创建函数,该函数将以某种颜色打印绑定到变量的消息。消息变量作为此函数的参数传递。问题是我只得到第一个空格之前的文本(只有消息的第一个单词)。我的脚本如下所示:


#!/usr/bash


lbGREEN='\e[1;92m'

NC='\e[0m'


normalMessage="Everything fine"


echo_message() {


    echo -e  ${lbGREEN}$1${NC}


}


echo_message $normalMessage 

我的输出是:


Everything


收到一只叮咚
浏览 320回答 3
3回答

慕斯709654

对我来说,我不得不更改“#!/ bin / bash”的标题,但是显然这对您来说不是问题。在回显中,仅打印带有$ 1的第一个单词,如果将其更改为$ 2,则将打印第二个单词(参数),依此类推。您可以在引号内传递名称,也可以使用$ @打印所有参数。解决方案1(带有$ @):lbGREEN='\e[1;92m'NC='\e[0m'normalMessage="Everything fine"echo_message() {    echo -e  ${lbGREEN}$@${NC}}echo_message $normalMessage解决方案2(带引号):lbGREEN='\e[1;92m'NC='\e[0m'normalMessage="Everything fine"echo_message() {    echo -e  ${lbGREEN}$1${NC}}echo_message "$normalMessage"

手掌心

您引用的报价有误。如果要模拟的行为echo,您的函数应接受多个参数,并全部打印出来。目前,它仅评估第一个参数,因此建议$*改用。您还需要将参数括在双引号中以保护任何特殊字符:echo_message() {    echo -e  "${lbGREEN}$*${NC}"}特殊变量$*将扩展到所有参数,并用空格(或更准确地说,是$ IFS的第一个字符,通常是空格字符)分隔。请注意,您几乎总是想要"$@"而不是"$*",这是少数情况也是正确的,尽管如果IFS将其设置为非标准值,其语义稍有不同。现在,该函数支持多个参数,并以绿色打印所有参数,并用空格分隔。但是,我建议您在调用函数时也引用该参数:echo_message "$normalMessage"尽管$normalMessage现在可以正确处理其中的空格,但其他特殊字符(如)!仍需要加引号。
打开App,查看更多内容
随时随地看视频慕课网APP