在centos系统shell脚本中cat和重定向符号<<EOF结合使用的注意事项

在运维人员编写shell脚本中,有时会需要将一些内容直接放在到一个文件,比如在一个shell脚本中配置一些内容再生成一个shell脚本,此时可以使用到cat命令和重定向符号“<<”以及EOF的使用。但是,在shell脚本中使用重定向符号生成shell脚本时,会遇到一些问题,比如,内容中含有特殊符号"#","`","$"时,(如果以“#”开头,则需要加转义符“\”)重定向会忽略这些特殊符号,而导致生成的shell脚本无法运行,此时只需要在这些特殊符号前加转义符号“\”即可,如下是一个自动安装nginx的脚本:

#!/bin/sh
#the script is install nginx
#echo "add user mars"
#groupadd xiaoyao && useradd -g xiaoyao xiaoyao && sed -i ‘s/\#PermitRootLogin yes/PermitRootLogin no/g‘ /etc/ssh/sshd_config && service sshd restart && passwd xiaoyao
echo "configure sysctl"
mv /etc/sysctl.conf /etc/sysctl.conf.bak
cat >>/etc/sysctl.conf<<EOF
net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
net.ipv4.tcp_max_tw_buckets = 6000
net.ipv4.tcp_sack = 1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_rmem = 4096 87380 4194304
net.ipv4.tcp_wmem = 4096 16384 4194304
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.netdev_max_backlog = 262144
net.core.somaxconn = 262144
net.ipv4.tcp_max_orphans = 3276800
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_mem = 94500000 915000000 927000000
net.ipv4.tcp_fin_timeout = 1
net.ipv4.tcp_keepalive_time = 30
net.ipv4.ip_local_port_range = 1024 65000
EOF

sysctl -p
echo "configure sysctl is complete!"

yum install -y gcc gcc-c++ openssl openssl-devel pcre-devel
cd /data/tools
tar -zxvf pcre-8.37.tar.gz -C /usr/local/src/
cd /usr/local/src/pcre-8.37/
./configure --prefix=/usr/local/pcre
make &&make install
cd /data/tools
tar -zxvf libevent-2.0.22-stable.tar.gz -C /usr/local/src/
cd /usr/local/src/libevent-2.0.22-stable/
./configure --prefix=/usr/local/libevent
make && make install
cd /usr/local/libevent/
ln -s /usr/local/libevent/include /usr/include/libevent
echo "/usr/local/libevent/lib" >>/etc/ld.so.conf.d/libevent.conf
ldconfig -pv | grep libevent
groupadd nginx
useradd -r -g nginx -s /sbin/nologin -M nginx
cd /data/tools
tar -zxvf nginx-1.8.0.tar.gz -C /usr/local/src/
cd /usr/local/src/nginx-1.8.0/
 ./configure --conf-path=/etc/nginx/nginx.conf  --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid  --lock-path=/var/lock/nginx.lock  --user=nginx  --group=nginx  --with-http_ssl_module --with-http_flv_module --with-http_stub_status_module --with-http_gzip_static_module --http-client-body-temp-path=/var/tmp/nginx/client/ --http-proxy-temp-path=/var/tmp/nginx/proxy/ --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ --with-pcre=/usr/local/src/pcre-8.37
ln -s /var/log/nginx/error.log /etc/nginx/error.log
ln -s /var/log/nginx/access.log /etc/nginx/access.log
ln -s /var/run/nginx.pid /etc/nginx/nginx.pid
ln -s /var/lock/nginx.lock /etc/nginx/nginx.lock
make && make install
cd /usr/local/nginx
mkdir -pv /var/tmp/nginx/client
mkdir -pv /var/tmp/nginx/proxy
mkdir -pv /var/tmp/nginx/fcgi
echo "PATH=$PATH:/usr/local/nginx/sbin" >>/etc/profile
source /etc/profile
cat >>/etc/init.d/nginx<<EOF
\#!/bin/bash
\# chkconfig: 2345 65 45
\# description: nginx serverdaemon
prog=/usr/local/nginx/sbin/nginx
lockfile=/var/lock/nginx.lock
pidfile=/var/run/nginx.pid
start(){
#以下的$、`、#前都加了转义符号"\"
      [ -f \$lockfile ] && echo"nginx is started." && exit
      echo -n "nginx is starting.."
      sleep 1 && echo -n"."
      \$prog &&  echo -e  "\$space[\033[32m OK\033[0m]" && touch \$lockfile || echo  -e "\$space[\033[31m failed\033[0m]"
}
stop(){
      [ ! -f \$lockfile ] && echo"nginx is stopped." && exit
      echo -n "nginx is stopping.."
      sleep 1 && echo -n"."
      \$prog -s stop && echo  -e "\$space[\033[32m OK \033[0m]"&& rm -f \$lockfile || echo  -e"\$space[\033[31m failed \033[0m]"
}
status(){
      [ ! -f \$pidfile ] && echo"nginx is stoped" || echo "\`cat \$pidfile\`,nginx is running"
}

case "\$1" in
start)
      start
      ;;
stop)
      stop
      ;;
restart)
      stop
      start
      ;;
status)
      status
      ;;
*)
      echo "UASGE IS:start|stop|restart|status"
      ;;
esac

EOF
#生成后,需要将“\#”修改会“#”,而“\`”及“\$”则会自动转为“`”以及“$”
sed -i ‘s/\\\#/\#/g‘ /etc/init.d/nginx
chmod  +x /etc/init.d/nginx
chkconfig --add nginx
chkconfig --list nginx
service nginx start
echo "suessfull!!"

通过以上操作,我们就很方便的在shell脚本中实现生成文件或者脚本了。

还有请注意,如“\”转义符不能同时有两个以上,否则也会无法写入。

时间: 2025-01-01 23:39:31

在centos系统shell脚本中cat和重定向符号<<EOF结合使用的注意事项的相关文章

查看CentOS系统shell脚本语言支持的种类

1,使用cat /etc/shells 可以看到当前系统支持的shell脚本语言支持的种类 备注:Linux系统中的主流Shell是bash,bash是由Bourne Shell(sh)发展而来的,同时bash还包含了csh和ksh的特色,但大多数脚本都可以不加修改地在sh上运行,如果使用了sh后发现结果和预期有差异,那么可以尝试用bash替代sh. 2,查看当前系统默认使用的shell命令如下或者查看系统的用户信息文件也可以看到 原文地址:http://blog.51cto.com/13718

Linux系统Shell脚本编程

1. shell脚本概念:C语言编写的.命令解释器.编程语言. 是用户使用linux的桥梁. shell脚本语言非常擅长处理文本类型的数据. 2. shell脚本作用:自动化管理.监控管理.日志数据处理.自动数据备份. 3. shell脚本中的成分:注释.命令.shell变量.结构控制语句. 以行为单位  一行一行依次执行. (在shell脚本中可以出现任何在交互方式下可以使用的命令.) 4. 调用shell脚本的两种方式: (1)sh 脚本文件名 (2)./脚本文件名(需要有执行权限) 当执行

shell脚本中实现自动判断用户有无密码

在最近完成老师布置的作业的时候遇到了如何让shell脚本中的命令自动判断一个用户是否已设置密码的问题,虽然看似不是很难的一个问题,但是在这一功能实现的过程中却包含了许多细小的而重要的知识.刚开始小编对此很是头疼,虽然我们查看一个用户是否有密码并不是很难,直接cat /etc/shadow这个文件看看密码位是否有加密的字符就行了,但是让命令自己去判断和匹配就不是很顺利了,小编上网查看后,并没有得到很好的答案,大多数都是人工查看的答案,并不适用于shell脚本中自动的判断,所以在认真对比/etc/p

shell脚本中if与case使用,查找文件locate与find的使用,压缩,解压及归档工具

shell脚本中if与case使用 查找文件locate与find的使用 压缩,解压及归档工具 执行的循序  顺序执行  选择执行  循环执行 条件语句if if只是一个有含义的词,不能单独作为指令使用. 单分支 if 条件判断:then 条件为真的分支代码 fi 双分支 if 判断条件:then 条件为真的分支代码 else 条件为假的分支代码 fi 多分支 if 判断条件1, if-true elif 判断条件2,then if-ture elif 判断条件3,then if-ture ..

老男孩教育每日一题:2017年3月9日-请解释下面Shell脚本中if开头的整行代码的意思及应用场景吗?

请解释下面Shell脚本中 if开头的整行代码的意思,你见过它的应用场景么? if(kill -0 $pid 2>/dev/du11) then     echo"oldboy" else    echo"oldgirl" fi 面试题:请解释if (kill -0 $pid 2>/dev/null)代码的意思? if(kill -0 $pid 2>/dev/null)     then        echo "oldboy"

Shell脚本中执行sql语句操作

这篇文章主要介绍了Shell脚本中执行sql语句操作mysql的5种方法,本文讲解了将SQL语句直接嵌入到shell脚本文件中.命令行调用单独的SQL文件.使用管道符调用SQL文件等方法,需要的朋友可以参考下 对于自动化运维,诸如备份恢复之类的,DBA经常需要将SQL语句封装到shell脚本.本文描述了在Linux环境下mysql数据库中,shell脚本下调用sql语句的几种方法,供大家参考.对于脚本输出的结果美化,需要进一步完善和调整.以下为具体的示例及其方法. 1.将SQL语句直接嵌入到sh

Shell脚本中执行mysql语句

对于自动化运维,诸如备份恢复之类的,DBA经常需要将SQL语句封装到shell脚本.本文描述了在Linux环境下mysql数据库中,shell脚本下调用sql语句的几种方法,供大家参考.对于脚本输出的结果美化,需要进一步完善和调整.以下为具体的示例及其方法. 1.将SQL语句直接嵌入到shell脚本文件中 --演示环境 [[email protected] ~]# more /etc/issue CentOS release 5.9 (Final) Kernel \r on an \m   [e

Shell脚本中执行mysql的几种方式(转)

Shell脚本中执行mysql的几种方式(转) 对于自动化运维,诸如备份恢复之类的,DBA经常需要将SQL语句封装到shell脚本.本文描述了在Linux环境下mysql数据库中,shell脚本下调用sql语句的几种方法,供大家参考.对于脚本输出的结果美化,需要进一步完善和调整.以下为具体的示例及其方法. 1.将SQL语句直接嵌入到shell脚本文件中 复制代码 代码如下: --演示环境   [[email protected] ~]# more /etc/issue   CentOS rele

20.1 shell脚本介绍 20.2 shell脚本结构和执行 20.3 date命令用法 20.4 shell脚本中的变量

- 20.1 shell脚本介绍 - 20.2 shell脚本结构和执行 - 20.3 date命令用法 - 20.4 shell脚本中的变量 # 20.1 Shell脚本介绍 -  shell是一种脚本语言  关注aming_linux  blog.lishiming.net -  可以使用逻辑判断.循环等语法 -  可以自定义函数 -  shell是系统命令的集合 -  shell脚本可以实现自动化运维,能大大增加我们的运维效率 # 20.2 Shell脚本结构和执行 - 开头需要加#!/b