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

s-k*_*rek 4 linux bash shell scripting

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

#!/usr/bash

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

normalMessage="Everything fine"

echo_message() {

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

}

echo_message $normalMessage 
Run Code Online (Sandbox Code Playgroud)

我的输出是:

Everything
Run Code Online (Sandbox Code Playgroud)

Wil*_*ell 5

正如 Inian 在评论中指出的那样,你的问题是未加引号的变量扩展

echo_message $normalMessage 
Run Code Online (Sandbox Code Playgroud)

变成

echo_message Everything fine
Run Code Online (Sandbox Code Playgroud)

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

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

echo_message "$normalMessage"
Run Code Online (Sandbox Code Playgroud)

变成

echo_message "Everything fine"
Run Code Online (Sandbox Code Playgroud)

像这样$1=Everything fine

将来,我建议使用https://www.shellcheck.net/,或者 shellcheck 的 CLI 版本,它将突出显示各种常见的 bash 陷阱,包括未引用的扩展。