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

