使用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 puresh
是什么意思?基本上检查这个答案我的意思是只使用符合POSIX的sh
@nbari我阅读了答案。好的,但是我不明白为什么我的bash脚本不是纯的sh
。此外,我通过sh celeryd.sh
执行脚本。除了复制到文件之外,一切都正常,如果变量未在我的bash脚本中定义,它不会复制变量。您可能需要调查FreeBSD中cat与默认未安装bash
之间的差异,我建议使用puresh
,这样您的脚本就可以更方便地移植。@nbari您所说的puresh
是什么意思?检查这个答案基本上我的意思是只使用符合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