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

使用echo创建shell脚本文件时-e参数被写入文件是什么原因?

问题根因

-e被写入文件的核心原因是不同Shell环境下echo命令的实现不统一:

  • 日常交互场景你大概率用的是Bash,它内置的echo会将-e识别为「启用转义字符」的开关,不会当做内容输出
  • 当脚本运行时,如果系统默认Shell是Dash(Debian/Ubuntu等发行版默认的sh解释器为Dash),它的echo不识别-e参数,会直接将-e当做普通文本输出到结果里。

解决方案

方案1:快速修复

在你当前运行的脚本第一行加上#!/bin/bash,强制脚本用Bash解释器执行,即可正确识别-e参数不会被输出。该方法改动最小,但可移植性一般。

方案2:用printf替代echo -e(推荐)

printf是POSIX标准规定的命令,所有Shell下行为完全一致,不会出现参数识别异常的问题。你原写法里的echo -e "xxx\nyyy"可以直接替换为printf "xxx\nyyy\n"。

方案3:用Here文档生成脚本(最适合当前场景)

你需要生成完整的.sh脚本文件,用Here文档不需要手动写大量\n和转义引号,可读性高且不容易出错,参考写法如下:

#!/bin/bash
FOLDER=$(zenity --forms --add-entry=repo-folder-name)
CLONE_LINK=$(zenity --forms --add-entry=Github-Clone-Link)
SCRIPT_NAME=$(zenity --forms --add-entry=script-name).sh
cd ~/SM64LBuilder/scripts

# 用here-doc写入脚本,EOF加引号可以避免父脚本提前转义内部的$变量
# 若需要追加内容而非覆盖,把 > 改成 >> 即可
cat > "$SCRIPT_NAME" <<'EOF'
cd ~/SM64LBuilder/repos 
git clone CLONE_LINK
echo "Please select your baserom" 
cp $(zenity --file-selection --file-filter='z64 ROMS (z64) | *.z64' --title="Select your baserom.us.z64 ROM") FOLDER
cd FOLDER 
echo "Would you like patches? [y/n]" 
read answer 
if [ $answer = "y" ]; then 
echo "How many?"
read number
for i in $(seq 1 $number); do echo "Chose a file" && git apply $(zenity --file-selection --file-filter='patch files (patch) | *.patch' --title="Select your patch file"); done 
fi 
echo "Starting compilation of FOLDER..." 
IN=$(zenity --list --checklist --title "Build Flags" --text "Flags" --column "" --column "Options" True VERSION=us False VERSION=eu False VERSION=jp False VERSION=sh False TARGET_BITS=32 True TARGET_BITS=64 False TARGET_RPI=1 False TARGET_WEB=1 False WINDOWS_BUILD=1 False OSX_BUILD=1 WINDOWS_CONSOLE=1 DEBUG=1 BETTERCAMERA=1 NODRAWINGDISTANCE=1 TEXTURE_FIX=1 EXT_OPTIONS_MENU=1 EXTERNAL_DATA=1 DISCORDRPC=1 TEXTSAVES=1) 
if [ $1 == "--jobs" ]; then 
make $(echo $IN | tr "|" " ") $2 
else 
make $(echo $IN | tr "|" " ") 
fi 
echo "FOLDER compiled!"
EOF

# 替换提前获取的变量占位符
sed -i "s/FOLDER/$FOLDER/g" "$SCRIPT_NAME"
sed -i "s/CLONE_LINK/$CLONE_LINK/g" "$SCRIPT_NAME"

# 给生成的脚本添加执行权限
chmod +x "$SCRIPT_NAME"

注:以上写法补充了你原脚本中缺失的read number逻辑,原循环用到的$number变量没有赋值步骤会导致运行报错。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 20:24:09