Как вывести текст и результат выполения функции одновременно?
Нужно вывести текст и результат выполнения функции, которые извлекается из файла, одновременно. Делаю по варианту 1, выводится как текст "a fun_b". функция не выполнилась. Делаю по варианту 2, выводится как результат команды и соответственно команду "а" не находит "./test.sh: line 13: a: command not found". Нужный результат "a b". Как сделать?
#!/bin/bash
fun_b ()
{
echo "b"
}
cat ./1.txt
text="$(cat ./1.txt)"
echo "$text" # 1 вариант. как текст
echo "$($text)" # 2 вариант. как команда
# нужно чтобы вывод был такой "a b"
Вывод
a fun_b
a fun_b
./test.sh: line 13: a: command not found
Ответы (1 шт):
Если вы хотите преобразовать текстовую строку в команду то для этого можно использовать eval
$ eval 'echo Текст'
Текст
но для корректной работы eval нужно чтобы весь передаваемый текст был валидным.
В вашем же примере выдаёт ошибку так как а это неизвестная команда, в bash первое слово означает команду, а последующие слова это параметры данной команды. То есть, если смотреть второй вариант
fun_b(){ echo "b";}
text="a fun_b"
eval $text
выходит что нужно выполнить команду/функцию a и передать ей один параметр fun_b, что естественно вызовет ошибку, так как a это неизвестная команда/функция.
чтобы получить в ответ строку a b, где a это текст, а b результат работы функции fun_b нужно будет сравнить каждое слово и если оно соответствует указанной функции то выполнить эту функцию и вернуть результат, в противном случае просто вывести слово. В простом варианте это будет выглядеть примерно так:
fun_b(){ echo "b";}
text="a fun_b"
z=($text) # arrays
for i in "${z[@]}"; do
[[ "$i" == "fun_b" ]] && fun_b || echo -n "$i "
done