Я функция read_command определяется как:Bash подстановка переменной в функции
function read_command {
local __newline __lines __input __newstr __tmp i;
exec 3< "$*";
__newline=$'\n';
__lines=();
while IFS= read <&3 -r __line && [ "$__line" != '####' ]; do
echo "$__line";
__lines+=("$__line");
done
while IFS= read <&3 -r __line && [ "$__line" != '####' ]; do
read -e -p "${__line#*:}$PS2" __input;
local ${__line%%:*}="$__input";
done
__command="";
for i in "${__lines[@]}"; do
__tmp=$(echo "${i}");
__command="${__command} ${__newline} ${__tmp}";
done
echo -e "$__command";
}
В текущем каталоге есть файл с именем «тест», со следующим содержанием:
greet ${a:-"Bob"}
greet ${b:-"Jim"}
####
a: name of friend a
b: name of friend b
####
В терминале выполнена команда
read_command test
Без ввода я ожидаю положить последнего утверждения быть:
greet Bob
greet Jim
Но то, что я получаю:
greet ${a:-"Bob"}
greet ${b:-"Jim"}
Что здесь не так?
Редактировать: Как предложил Дэвид, добавление eval работает в некоторых случаях, за исключением следующего.
j=1;i="export DISPLAY=:0 && Xephyr :${j}&";k=$(eval echo "$i");
echo $k
экспорт DISPLAY =: 0
Я ожидаю K быть "экспорт DISPLAY =: 0 & & Xephyr: 1 &", что здесь не так? Edit: Я попытался с помощью следующей
k=$(eval "echo \"$i\"")
Это ссылка на сценарий я работаю. https://gist.github.com/QiangF/565102ba3b6123942b9bf6b897c05f87
Точки с запятой в конце строки являются излишними; в сценарии оболочки новая строка * или * точка с запятой достаточна в качестве разделителя команд. – tripleee
Я просто следую примеру, в Интернете слишком много плохих примеров. – godblessfq