使用bash脚本将内容写入文件

使用bash脚本将内容写入文件,bash,unix,freebsd,Bash,Unix,Freebsd,我正在尝试创建一个bash脚本,以便守护celeryd任务。在我的bash脚本中,我需要创建一些文件并添加内容。此内容有一个由名为$app_name的用户通过read method指定的变量,以及内容中的一些其他变量 问题: 当我将bash脚本中的内容复制到给定的路径时,它不会复制其中已经存在的变量 示例: 在我的bash脚本中,我有: ######################## # Get application name # ######################## read

我正在尝试创建一个
bash脚本
,以便
守护celeryd任务
。在我的bash脚本中,我需要创建一些文件并添加内容。此内容有一个由名为
$app_name
的用户通过
read method
指定的变量,以及内容中的一些其他变量

问题:

当我将bash脚本中的内容复制到给定的路径时,它不会复制其中已经存在的变量

示例:

在我的bash脚本中,我有:

########################
# Get application name #
########################

read -p "Define the application name (lowercase and without spaces): " app_name
echo "You defined the application name: $app_name"

############################################################
# Create service file /usr/local/etc/rc.d/celeryd_app_name #
############################################################

cat > /usr/local/etc/rc.d/celeryd_$app_name << EOF
#!/bin/sh
# =====================================================
#  celeryd_$app_name - Starts the Celery worker daemon.
# =====================================================
#
# :Usage: /etc/init.d/celeryd_$app_name {start|stop|force-reload|restart|try-restart|status}
# :Configuration file: /etc/default/celeryd_$app_name

### BEGIN INIT INFO
# Provides:          celeryd_$app_name
# Required-Start:    $network $local_fs $remote_fs
# Required-Stop:     $network $local_fs $remote_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
### END INIT INFO
EOF
它不会复制内容中存在的
$network$local\u fs$remote\u fs

还有别的办法吗


谢谢大家!

发生的情况是,正在扩展变量,并且由于未声明这些变量,因此从wiki获取空值:

默认情况下,行为基本上与双引号的内容相同:变量名替换为其值,反勾号内的命令求值,等等


发生的情况是,正在扩展变量,并且由于未声明这些变量,因此从wiki获取空值:

默认情况下,行为基本上与双引号的内容相同:变量名替换为其值,反勾号内的命令求值,等等


在FreeBSD中,默认情况下未安装bash,我建议使用pure
sh
,这样可以使脚本更便于移植。@nbari pure
sh
是什么意思?基本上检查这个答案我的意思是只使用符合POSIX的
sh
@nbari我阅读了答案。好的,但是我不明白为什么我的bash脚本不是纯的
sh
。此外,我通过
sh celeryd.sh
执行脚本。除了复制到文件之外,一切都正常,如果变量未在我的bash脚本中定义,它不会复制变量。您可能需要调查FreeBSD中
cat与默认未安装bash
之间的差异,我建议使用pure
sh
,这样您的脚本就可以更方便地移植。@nbari您所说的pure
sh
是什么意思?检查这个答案基本上我的意思是只使用符合sh POSIX的
nbari我读了答案。好的,但是我不明白为什么我的bash脚本不是纯的
sh
。此外,我通过
sh celeryd.sh
执行脚本。除了复制到文件之外,所有事情都可以正常工作,如果在我的bash脚本中没有定义变量,它就不会复制变量
### BEGIN INIT INFO
# Provides:          celeryd_$app_name
# Required-Start:    
# Required-Stop:     
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
### END INIT INFO
$ cat << EOF
> \$ Working dir "$PWD" `pwd`
> EOF
$ Working dir "/home/user" /home/user
$ cat << 'EOF'
> \$ Working dir "$PWD" `pwd`
> EOF
\$ Working dir "$PWD" `pwd`
#!/bin/sh

cat << 'EOF' > /usr/local/etc/rc.d/celeryd_$app_name
#!/bin/sh
# =====================================================
#  celeryd_$app_name - Starts the Celery worker daemon.
# =====================================================
#
# :Usage: /etc/init.d/celeryd_$app_name {start|stop|force-reload|restart|try-restart|status}
# :Configuration file: /etc/default/celeryd_$app_name
### BEGIN INIT INFO
# Provides:          celeryd_$app_name
# Required-Start:    $network $local_fs $remote_fs
# Required-Stop:     $network $local_fs $remote_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
### END INIT INFO
EOF
#!/bin/sh
# =====================================================
#  celeryd_$app_name - Starts the Celery worker daemon.
# =====================================================
#
# :Usage: /etc/init.d/celeryd_$app_name {start|stop|force-reload|restart|try-restart|status}
# :Configuration file: /etc/default/celeryd_$app_name
### BEGIN INIT INFO
# Provides:          celeryd_$app_name
# Required-Start:    $network $local_fs $remote_fs
# Required-Stop:     $network $local_fs $remote_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
### END INIT INFO