shell之cat实用技巧

作者: admin 分类: Linux,Shell脚本 发布时间: 2022-07-30 17:01


技巧1:cat的多行输出

  • 一般用于脚本提示帮助或选择菜单
[root@localhost ~]# cat << EOF      # EOF为自定义结束符(可以是其它字符,如EOO),需要在结尾输入EOF表示输出内容结束
cat多行输出第一行
cat多行输出第二行
cat多行输出第三行
EOF               # EOF表示结束,注意与开头字符保持一致

技巧2:cat 的多行文件内容覆盖或追加

  • 一般用于脚本配置服务的配置文件如ftp配置文件等
cat>/etc/vsftpd/vsftpd.conf<<EOF     # cat>为覆盖内容,cat>>为追加内容
#禁止匿名用户登录
anonymous_enable=NO
#允许本地用户登录
local_enable=YES
#启用虚拟账户 
guest_enable=YES
#把虚拟账户映射到系统账户virftp               
guest_username=virftp
#使用虚拟用户验证(PAM验证)
pam_service_name=vsftpd
#设置存放各虚拟用户配置文件的目录(此目录下与虚拟用户名相同的文件为他的配置文件)
user_config_dir=/etc/vsftpd/vsftpd_viruser
#启用chroot时,虚拟用户根目录允许写入
allow_writeable_chroot=YES
#开启主动模式
port_enable=YES
#主动模式进行数据传输时使用20端口
connect_from_port_20=YES
#开启被动模式
pasv_enable=YES
pasv_min_port=3000
pasv_max_port=3100
EOF

技巧3:cat的输出内容中含有变量

  • 注:如果输出内容是字符串使用前面2种技巧即可,但当输出内容含有变量使用前面技巧就会报错,出现不能运行问题,这是因为内容中如果有变量在运行时shell会自动解析特殊字符,因此需要在开始EOF使用单引号或双引号括起来或使用\EOF(建议使用单引号或\EOF)
cat >/root/s.txt << 'EOF'     # EOF使用单引号或双引号括起来或使用\EOF
rm_file(){ 
opt=^-. 
rm_path=/tmp/rm_tmp.txt 
echo $@ >${rm_path}                     # 如果前面没把EOF使用单引号或双引号括起来或使用\EOF,shell就会解析$@/${rm_path}的值
tr " " '\n' <${rm_path} &>/dev/null
for i in $(cat ${rm_path})
do
if [ "$i" = "-r" ];then
echo "$i is ok"
elif [ $i = "-f" ];then
echo "$i is ok"
elif [[ $i =~ $opt ]];then
echo "$i is no"
fi
done
}
rm_file
EOF                             # 结尾不需要添加,否则会结束不了

技巧4:cat >/root/s.txt << ‘EOF’ 也可以写成 cat << ‘EOF’ >/root/s.txt

cat << 'EOF' >/root/s.txt  # 只是EOF的位置不同,效果相同
rm_file(){
opt=^-. 
rm_path=/tmp/rm_tmp.txt 
echo $@ >${rm_path} 
tr " " '\n' <${rm_path} &>/dev/null
for i in $(cat ${rm_path})
do
if [ "$i" = "-r" ];then
echo "$i is ok"
elif [ $i = "-f" ];then
echo "$i is ok"
elif [[ $i =~ $opt ]];then
echo "$i is no"
fi
done
}
rm_file
EOF 

技巧5:EOF与-EOF区别

#!/bin/bash
cat <<EOF
        群鸟社区
EOF

cat <<-EOF
        群鸟社区
EOF

技巧6:EOF多行注释

#!/bin/bash
: <<EOF
多行注释
不显示EOF中的内容
EOF
echo "eof多行注释"
  • 注:如果出下面情况说明没加引号引起的问题

温馨提示:如无特殊说明,本站文章均为作者原创,转载请注明出处!

发表回复