Shell实现命令输出赋值给多个全局变量并打印的问题求助
可行解决方案
方案1:修正eval用法,在当前shell执行生成的命令
你之前的eval写法出错是因为嵌套引号转义逻辑错误,直接捕获生成的完整命令再用eval执行即可,变量会保存在当前shell会话:
var=4 com="$(echo "A\nB\nC\nD" | sed 's/\\n/\n/g')" # 捕获生成的read命令,eval执行后直接echo变量 eval "$(seq "$var" | sed 's/^/var/g' | xargs | sed 's/^/read /g' | sed "s/\$/ <<< \"\$com\"/g")" && echo $var1 $var2 $var3 $var4
执行后直接输出A B C D。
方案2:更简洁的循环实现(避免复杂转义)
不需要拼接动态read命令,用循环赋值逻辑更稳定,可读性更高:
var=4 # 直接用ANSI-C引号定义换行分隔的内容,省略额外sed处理 com=$'A\nB\nC\nD' # 循环逐行读取赋值给对应变量 for ((i=1; i<=var; i++)); do read -r "var$i" done <<< "$com" echo "$var1 $var2 $var3 $var4"
原有方案失败原因
- 反引号包裹执行:shell语法解析顺序问题,
<<<重定向符会被识别为普通文本参数,命令执行语法错误 - 管道给bash执行:bash是独立子进程,子进程内赋值的变量不会同步到父级当前shell
- 原有eval写法:嵌套双引号未正确转义,导致sed生成的命令格式错误
- 拼接echo管道给bash:变量在子进程内生效,父进程无法读取,同时$com转义错误导致内容展开异常
内容的提问来源于stack exchange,提问作者kung
相关产品推荐
相关产品推荐

