繁体   English   中英

函数中的Bash变量替换

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM