Некорректно передается строка из нескольких слов в функцию bash

есть следующий код:

#!/bin/bash

green="\033[1;32m"
red="\033[1;31m"
default_color="\033[0m"

declare -A kesl_tasks_human_name
kesl_tasks_human_name[file_threat_protection]="Защита от файловых угроз"
kesl_tasks_human_name[scan_my_computer]="Антивирусная проверка"
kesl_tasks_human_name[scan_file]="Выборочная проверка"

function report_success {
    echo -e $green"[SUCCESS]$default_color $1"
}

function report_fail {
    echo -e $red"[FAIL]$default_color $1"
}

a=file_threat_protection
report_success ${kesl_tasks_human_name[$a]}

По итогу функция report_success выводит на stdout Защита вместо ожидаемого Защита от файловых угроз. Подскажите в чем я ошибся и как переработать код?


Ответы (2 шт):

Автор решения: Алексей Р

Фраза обрезается при передаче аргумента в функцию. Нужно взять аргумент в кавычки "$arg"

report_success "${kesl_tasks_human_name[$a]}"
[SUCCESS] Защита от файловых угроз
→ Ссылка
Автор решения: Ivan

Ответ Алексея абсолютно верен, попробую объяснить на упрощенном примере. Функция:

fun(){
    echo $1 # Вывод 1-го аргумента функции
}

Пробуем такое:

$ fun раз два три
раз

А теперь такое:

$ fun "раз два три"
раз два три

Тот же принцип работает с содержимым переменных и индексов в массивах.

var="раз два три"
$ fun $var
раз
$ fun "$var"
раз два три

declare -A arr=([тест]="раз два три")
$ fun ${arr[тест]}
раз
$ fun "${arr[тест]}"
раз два три

Но если мы изменим функцию вот так:

fun(){
    echo $@ # Вывод всех аргументов функции
}

То результат будет одинаков всегда:

$ fun раз два три
раз два три

$ fun "раз два три"
раз два три

$ fun $var
раз два три

$ fun "$var"
раз два три

$ fun "${arr[тест]}"
раз два три

$ fun ${arr[тест]}
раз два три
→ Ссылка