[英]Bash variable substitution in a function
我有一个函数read_command定义为:
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";
}
当前目录中有一个名为“ test”的文件,其内容如下:
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"}
怎么了
编辑:根据大卫的建议,除以下情况外,在某些情况下添加评估功能。
j=1;i="export DISPLAY=:0 && Xephyr :${j}&";k=$(eval echo "$i");
echo $k
出口DISPLAY =:0
我期望k为“ export DISPLAY =:0 && Xephyr:1&”,这怎么了? 编辑:我尝试了以下
k=$(eval "echo \"$i\"")
这是我正在处理的脚本的链接。 https://gist.github.com/QiangF/565102ba3b6123942b9bf6b897c05f87
在第一个while
循环中,在echo "$__line"
,您有__line='greet ${a:-"Bob"}'
。 当您尝试打印时,Bash不会将${a:-"Bob"}
扩展到Bob
。 (即使删除$__line
周围的引号也不会发生。)要获得这种效果,您需要添加eval
,例如, eval echo "$__line"
。 不幸的是, eval
附带蠕虫病毒,您必须开始担心报价水平等之间的相互作用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.