Bash 脚本 CAT 命令使用脚本参数而不是在 cat 文件中留下 $1

Bash script CAT command uses the script parameters rather than leaving $1 in the cat'd file

我在尝试 cat 新文件时遇到 bash 脚本的一些问题。

#!/bin/bash


#sudo vim /etc/init.d/glassfish

sudo cat > /etc/init.d/glassfish <<EOF

# Set path variable
GLASSFISH_HOME=/opt/glassfish3

# Establish Commands
case "" in
start)
    ${GLASSFISH_HOME}/bin/asadmin start-domain domain1
    ;;
stop)
    ${GLASSFISH_HOME}/bin/asadmin stop-domain domain1
    ;;
restart)
    ${GLASSFISH_HOME}/bin/asadmin stop-domain domain1
    ${GLASSFISH_HOME}/bin/asadmin start-domain domain1
    ;;
*)
    echo "usage: [=11=] {start|stop|restart}"
    ;;
esac    
exit 0
EOF>

但是,当我 运行 这个脚本时,它将 $1 和 $0 替换为我用来调用 运行 命令的脚本,所以 $1 变成 "" 而 $0 变成 testscript.sh

有什么办法可以避免这种情况吗?

如果此处的文档定界符完全未加引号,则内容将被视为双引号字符串。至少引用分隔符的一个字符(最简单的是只引用整个内容),将此处的文档视为单引号字符串,防止参数扩展。

sudo tee /etc/init.d/glassfish > /dev/null <<'EOF'
...
EOF

为什么我使用 tee 而不是 cat?输出重定向不受 sudo 的影响,因为文件是在 shell 之前 sudo 甚至 运行 之前打开的。如果您需要 sudo 因为您没有对 /etc/init.d/ 的写权限,您需要 运行 像 tee 这样的命令来打开文件本身。