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
相关产品推荐
相关产品推荐

