为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

收到一只叮咚 2021-04-11 08:58:57
我正在尝试创建函数,该函数将以某种颜色打印绑定到变量的消息。消息变量作为此函数的参数传递。问题是我只得到第一个空格之前的文本(只有消息的第一个单词)。我的脚本如下所示:#!/usr/bashlbGREEN='\e[1;92m'NC='\e[0m'normalMessage="Everything fine"echo_message() {    echo -e  ${lbGREEN}$1${NC}}echo_message $normalMessage 我的输出是:Everything
查看完整描述

3 回答

?
慕斯709654

TA贡献1840条经验 获得超5个赞

对我来说,我不得不更改“#!/ 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"


查看完整回答
反对 回复 2021-04-16
?
手掌心

TA贡献1942条经验 获得超3个赞

您引用的报价有误。

如果要模拟的行为echo,您的函数应接受多个参数,并全部打印出来。目前,它仅评估第一个参数,因此建议$*改用。您还需要将参数括在双引号中以保护任何特殊字符:

echo_message() {    echo -e  "${lbGREEN}$*${NC}"}

特殊变量$*将扩展到所有参数,并用空格(或更准确地说,是$ IFS的第一个字符,通常是空格字符)分隔。请注意,您几乎总是想要"$@"而不是"$*",这是少数情况也是正确的,尽管如果IFS将其设置为非标准值,其语义稍有不同。

现在,该函数支持多个参数,并以绿色打印所有参数,并用空格分隔。但是,我建议您在调用函数时也引用该参数:

echo_message "$normalMessage"

尽管$normalMessage现在可以正确处理其中的空格,但其他特殊字符(如)!仍需要加引号。


查看完整回答
反对 回复 2021-04-16
  • 3 回答
  • 0 关注
  • 319 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信