如何将多个echo输出赋值给变量并逐行写入文本文件
问题原因
写入内容被覆盖的核心原因是Shell重定向符的默认逻辑:
- 单大于号
`>`是覆盖写入模式,每次执行都会先清空目标文件的全部原有内容,再写入新内容,所以多次执行后只会保留最后一次写入的值 - 双大于号
`>>`是追加写入模式,会在目标文件已有内容的末尾新增内容,不会清空原有数据
实现方法
根据你的使用场景,可以选以下两种常用实现方式:
逐行处理场景
如果你需要单独为每个echo输出赋值、再逐行写入文件,只需把写入操作的重定向符从`>`替换为`>>`即可。为了避免上次运行生成的旧文件内容残留,可以在写入前先清空目标文件:
# 提前清空旧文件,避免历史内容干扰 > docker.txt # 逐行赋值、逐行追加写入 var="$(echo "docker-virtual.artifactory.com/dotnetcore:latest")" echo "$var" >> docker.txt var="$(echo "docker-virtual.artifactory.com/images:latest")" echo "$var" >> docker.txt var="$(echo "docker-virtual.artifactory.com/nginx:latest")" echo "$var" >> docker.txt
批量写入场景
如果不需要逐行单独处理变量,可以把所有echo的输出归集后一次性写入文件,代码更简洁、执行效率更高:
# 方式1:先把所有输出存入同一个变量,再一次性覆盖写入 image_list="$( echo "docker-virtual.artifactory.com/dotnetcore:latest" echo "docker-virtual.artifactory.com/images:latest" echo "docker-virtual.artifactory.com/nginx:latest" )" echo "$image_list" > docker.txt # 方式2:直接给命令块做输出重定向,不需要定义中间变量 { echo "docker-virtual.artifactory.com/dotnetcore:latest" echo "docker-virtual.artifactory.com/images:latest" echo "docker-virtual.artifactory.com/nginx:latest" } > docker.txt
注意:echo输出变量时必须给变量加上双引号(例如
echo "$var"),否则变量内的换行符、连续空格会被Shell自动解析压缩,导致逐行存储的格式错乱。
内容的提问来源于stack exchange,提问作者Santoshkumar
相关产品推荐
相关产品推荐

