Некорректно передается строка из нескольких слов в функцию 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[тест]}
раз два три