【问题标题】:Bash script CAT command uses the script parameters rather than leaving $1 in the cat'd fileBash 脚本 CAT 命令使用脚本参数,而不是将 $1 留在 cat'd 文件中
【发布时间】:2017-03-08 21:05:51
【问题描述】:

我在尝试 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 "$1" 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: $0 {start|stop|restart}"
    ;;
esac    
exit 0
EOF>

但是,当我运行此脚本时,它会将 $1 和 $0 替换为我用来调用运行命令的脚本的内容,因此 $1 变为 "" 而 $0 变为 testscript.sh

有什么办法可以防止这种情况发生吗?

【问题讨论】:

  • 假设最后一个EOF&gt; 是错字? (s/b 只是 EOF,对 ;-) ? ) 祝你好运。

标签: bash shell suse


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2017-12-29
    • 2015-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多