美文网首页
(转载)Cat多行内容写入文本

(转载)Cat多行内容写入文本

作者: 7b7d23d16ab5 | 来源:发表于2019-12-21 22:04 被阅读0次

Cat命令结合重定向功能实现文本内容写入

原文链接:https://blog.csdn.net/networken/article/details/80564824

将stdin标准输入的内容重定向到test.txt文件(若此文件不存在,则创建),且当stdin中含有EOF时完成写入;
cat 追加内容用 >>,覆盖内容用 > ;
其中EOF可以替换为任意字符串。
写入内容到文本,覆盖文本原有内容

cat > /root/test.txt << EOF
this is first line 
this is second line
this is thrid line
EOF

追加内容到文本,保留文本原有内容

cat >> /root/test.txt << EOF
this is fourth line
this is fifth line
EOF

脚本中的变量问题

文本中的$TAG变量会被直接赋值,对第一个EOF加引号即可避免

TAG=8.0
cat > /root/run_mysql.sh << "EOF"
#!/bin/bash
docker run -it -d \
    --name mysql \
    -e MYSQL_ROOT_PASSWORD=my-secret-pw \
    mysql:$TAG
EOF

文本内容中的缩进

如果文本存在缩进格式,使用tab制表符缩进无法保留其缩进格式,如果希望保留缩进格式,需要使用空格缩进

cat > /root/test.txt << EOF
linegroup1
    this is first line 
    this is second line
linegroup2
    this is thrid line
    this is fourth line
EOF

空格缩进执行结果

# cat test.txt 
linegroup1
    this is first line 
    this is second line
linegroup2
    this is thrid line
    this is fourth line

tab缩进执行结果

# cat test.txt 
linegroup1
this is first line 
this is second line
linegroup2
this is thrid line
this is fourth line

第二个EOF前含有制表符

如果在脚本中使用cat EOF并且存在如下缩进格式,可以看到第二个EOF前含有缩进:

cat test.sh 
#!/bin/bash
if true;
then
        cat > /root/test.txt <<- EOF
        this is first line
        this is second line
        this is thrid line
        EOF
fi

缩进存在两种情况:tab制表符缩进和空格缩进,这种缩进会导致制表符或空格被判定为结尾符,而非EOF,针对制表符缩进将第一个EOF改为<<- EOF格式即可解决。

man bash中的说明:

# man bash | grep "<<-"
If the redirection operator is <<-, then all leading tab characters are stripped from input lines and the line  containing  delimiter.   This  allows

但是针对空格缩进该方法并不能解决问题,第二个EOF前如果为空格缩进必须修改为制表符缩进。

查看文本缩进格式,“^I”表示制表符,“$”表示换行符

:set list
:set list TAB 

直接将EOF输出传递给命令

# Create multiple YAML objects from stdin
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  name: busybox-sleep
spec:
  containers:
  - name: busybox
    image: busybox
    args:
    - sleep
    - "1000000"
---
apiVersion: v1
kind: Pod
metadata:
  name: busybox-sleep-less
spec:
  containers:
  - name: busybox
    image: busybox
    args:
    - sleep
    - "1000"
EOF

————————————————
版权声明:本文为CSDN博主「willblog」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/networken/article/details/80564824

相关文章

网友评论

      本文标题:(转载)Cat多行内容写入文本

      本文链接:https://www.haomeiwen.com/subject/mblnnctx.html