You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

向Awk传递"-e"参数出现意外结果,如何解决?

问题:无法将"-e "传递给Awk并正常输出

我编写了一段简短的Bash脚本,无法将"-e "传递给Awk:

str="Morgenstern"
ex = "-e "
for i in {1..11}
do
    echo $(echo $str| awk -v vv="$i" -v xx="$ex" 'print xx substr ($0,vv,1)}')
done

预期输出:

-e M
-e o
-e r
……

实际输出:

M
o
r
……

若将ex改为"-b "则能得到预期结果(如-b M、-b o等)。我也曾尝试在Awk语句中硬编码"-e ",结果依然不符合预期。请问如何让Awk接受"-e "作为参数或字面量?


解决方法

问题不在Awk,而是echo命令的特性导致的:echo会把以-e开头的字符串识别为转义功能开关,自动忽略掉-e本身,所以你看不到它的输出。

下面是两种可行的解决办法:

方法1:用printf替代echo

printf不会解析这类特殊开头的参数,能直接输出所有内容:

str="Morgenstern"
ex="-e "
for i in {1..11}
do
    printf "%s\n" "$(echo "$str" | awk -v vv="$i" -v xx="$ex" '{print xx substr($0,vv,1)}')"
done

方法2:给echo添加-E参数

-E参数会强制echo关闭转义解析,原样输出字符串:

str="Morgenstern"
ex="-e "
for i in {1..11}
do
    echo -E "$(echo "$str" | awk -v vv="$i" -v xx="$ex" '{print xx substr($0,vv,1)}')"
done

另外注意脚本里的语法错误:变量赋值时ex = "-e "中间的空格是不允许的,Bash变量赋值必须写成ex="-e ",否则会触发命令执行错误。


内容的提问来源于stack exchange,提问作者C0ppert0p

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 16:03:11