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

echo内容重定向到bash脚本时仅最后一行生效是什么原因?

问题根因

你每次写入文件时都使用了>覆盖重定向符号,该符号的作用是先清空目标文件所有内容,再写入新的内容。你循环执行多次echo写入,前面写入的所有内容都会被后一次的写入操作清空覆盖,最终文件里只会保留最后一次echo输出的fi内容。

此外你的代码还存在两个隐藏问题:

  • 你要写入到mkbackup.sh中的$#、$1、$2等变量,在当前写法下会被父脚本提前解析替换,不会原样保留到生成的子脚本中,后续子脚本运行会逻辑异常
  • 脚本中的条件判断[" $1" == "-z" ]存在语法错误,[和后续参数之间必须保留空格
修复方案

推荐使用Here Document方式批量写入内容,不需要多次调用echo,写法更简洁:

location=$(pwd)
target_file="$location/$new_file/backups/mkbackup.sh"
# 先确保目标目录存在,避免写入失败
mkdir -p "$(dirname "$target_file")"

# 带引号的EOF会让内容中的$等特殊符号原样保留,不会被父脚本解析
cat > "$target_file" <<'EOF'
#!/bin/bash
#MYNAME
#MYID
if [ $# -eq 0 ]; then
    cp -r ../backup/ ../src/*.*
fi
if [ $# -eq 1 ]; then
    echo "$1"
    given_file="$1"
    cp "$given_file" ../src/
fi
if [ $# -eq 3 ]; then
    if [ "$1" == "-z" ]; then
        tar -cf "$2" ../src/*.*
        cp "$2" ../backups/
    else
        tar -zcf "$2" ../src/*.*
        cp "$2" ../backups/
    fi
fi
if [ $# -eq 4 ]; then
    if [ "$1" == "-z" ]; then
        tar -cf "$2" ../src/"$4"
        cp "$2" ../backups/
    else
        tar -zcf "$2" ../src/"$4"
        cp "$2" ../backups/
    fi
fi
EOF

# 赋予执行权限即可,不需要开放全部rwx权限
chmod +x "$target_file"

如果你要坚持用echo方式写入,只需要把第一次写入之外的所有>替换为>>追加重定向符号即可,同时要手动转义所有需要保留的$为\$,比如echo "if [ \$# -eq 0 ]; then" >> 目标路径。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 08:09:02