【问题标题】:Why this bash function prints only first word of whole string?为什么这个 bash 函数只打印整个字符串的第一个单词?
【发布时间】:2018-05-09 18:54:34
【问题描述】:

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

#!/usr/bash

lbGREEN='\e[1;92m'
NC='\e[0m'

normalMessage="Everything fine"

echo_message() {

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

}

echo_message $normalMessage 

我的输出是:

Everything

【问题讨论】:

  • echo_message "$normalMessage",顺便说一句,您是否在#!/usr/bash 安装了bash?你是说#!/usr/bin/bash
  • 除非您有充分的理由不这样做,否则请始终引用您的变量。
  • @Inian 我错了#!/usr/bash,但结果证明脚本正在运行!
  • @s-kaczmarek 如果您使用bash myScript 运行脚本,则忽略shebang。
  • @chepner 是的,我就是这样运行这个脚本的!谢谢,现在我清楚了。

标签: linux bash shell scripting


【解决方案1】:

对我来说,我不得不更改“#!/bin/bash”的标题,但显然这对你来说不是问题。

在您的 echo 中,您只打印带有 $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"

【讨论】:

  • 使用 $@ 的解决方案对我来说似乎是完美的。非常感谢!
【解决方案2】:

正如 Inian 在 cmets 中指出的那样,您的问题是未引用的变量扩展

echo_message $normalMessage 

变成

echo_message Everything fine

一旦变量扩展,这意味着输入字符串的每个单词都将作为单独的参数读入。当这种情况发生时$1=Everything$2=fine

这可以通过双引号来解决,这允许扩展,但意味着扩展的结果仍将作为一个参数读取。

echo_message "$normalMessage"

变成

echo_message "Everything fine"

点赞$1=Everything fine

以后,我推荐使用https://www.shellcheck.net/,或者shellcheck 的CLI 版本,它会突出各种常见的bash 陷阱,包括不带引号的扩展。

【讨论】:

    【解决方案3】:

    你应该看看https://stackoverflow.com/a/6212408/1428602

    恕我直言,$1 只返回第一个单词,因此您必须使用循环或尝试使用 $*

    【讨论】:

    • 举个例子。 :)
    【解决方案4】:

    你的引用错了。

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

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

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

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

    echo_message "$normalMessage"
    

    虽然现在可以正确处理 $normalMessage 中的空格,但 ! 等其他特殊字符仍需要引号。

    【讨论】:

      猜你喜欢
      • 2015-04-25
      • 1970-01-01
      • 2016-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多