21 shell Here Document/String

Here Document 的用法

Here Document可以将它理解为“嵌入文档”“内嵌文档”“立即文档”,它将命令需要处理的数据或者字符串与代码放在一起,适用于命令需要处理的数据量很小,不必要将其单独放在一个文件中的情况。

总的来说,在脚本中嵌入一小段多行数据时,使用Here Document是很有用的,但是嵌入很大数据时,还是应该保持你的逻辑(你的代码)和你的输入(你的数据)分离,最好是在不同的文件中。

用法说明
command <<END
    document
END
  1. command是 Shell 命令,<<END是开始标志,END是结束标志,document是输入的文档(也就是一行一行的字符串)。
  2. 使用command明林处理document部分的数据,直到遇到终止符END为止(终止符END不会被读取)
  3. 终止符END必须独占一行,并且必须要顶格写。终止符可以出现在正常的数据流中,只要它不是顶格写的独立的一行,就不会被作为结束标志。
  4. 终止符可以由用户自定义
  5. 使用单引号或者双引号将分界符包围起来可以使 document中的命令替换失效
  6. <<END之间增加-来消除制表符的影响
  7. Here Document 常用于向用户显示命令或者脚本的用法信息
需求脚本结果

cat 命令一般是从文件中读取内容,并将内容输出到显示器上,

借助 Here Document,cat 命令可以从键盘上读取内容

 cat <<TEST

> test1

>  Test

>  TEST #终止符前有空格,不生效

> TEST #顶格写的终止符,不会输出

test1

 Test

 TEST

<是第二层命令提示符

正文中也可以出现结束标志TEST,但只要它不是独立的一行,

并且不顶格写,就不会生效。

在脚本文件中使用 Here Document,并将 document 中的内容转换为大写。
  1. #!/bin/bash
  2. #在脚本文件中使用立即文档
  3. tr a-z A-Z<<END 
  4. one two three
  5. AbCdefGH
  6. END

ONE TWO THREE

ABCDEFGH

tr命令 将小写字母转换称大写字母

命令替换

默认情况下,document中出现的变量或命令会被求值或运行,Shell 会先将它们替换以后再交给 command

但也可以将分界符用单引号或者双引号包围起来使 Shell 替换失效

1.默认情况

  1. name=qpy
  2. cat <<END
  3. > ${name} is a girl
  4. > END

2.使用单/双引号包围END使命令替换失效

1)单引号

  1. cat <<'END'
  2. > ${name} is a girl
  3. > END

2)双引号

  1. cat <<"END"
  2. > ${name} is a girl
  3. > END

输出:qpy is a girl

输出:${name} is a girl

输出:${name} is a girl

在脚本文件中使用 Here Document时,如果在document的行首使用制表符时,

默认情况下,行首的制表符也被当做正文的一部分,但也可以通过<<END之间增加-来消除制表符的影响

 

制表符主要是用于代码对齐

1.默认情况

#!/bin/bash

cat <<END

        aaa

        bbb

ccc

END

2.在<<END之间增加-来消除制表符的影响

#!/bin/bash

cat <<-END

        aaa

        bbb

ccc

END

输出

  1. aaa
  2. bbb
  3. ccc

 

输出

  1. aaa
  2. bbb
  3. ccc
Here Document 最常用的功能还是向用户显示命令或者脚本的用法信息

 

Here String的用法

Here String 是 Here Document 的一个变种

用法说明
command <<< string
  1. command 是 Shell 命令,string 是一个普通字符串。
  2. Here String可用于发送较短数据到进程中
  3. 当字符串中有空格时,必须使用单引号或双引号将字符串包围起来
  4. 使用双引号或不适用引号包围字符串时会解析字符串中的变量
  5. 使用单引号包围字符串时不会解析字符串中的变量
  6. 使用引号是,Here String 还可以接收多行字符串作为命令的输入
  7. 与 Here Document 相比,Here String 在发送变量内容(而不是文件)到像 grep 或者 sed 这样的过滤程序时相当方便
需求脚本结果
将小写字符串转换为大写字符串

tr a-z A-Z <<< one

ONE
使用双引号,会解析字符串中的变量

tr a-z A-Z <<< "one two three"

var=two

tr a-z A-Z <<<"one $var there"

ONE TWO THREE

ONE TWO THREE

使用单引号,不会解析变量

var=two

tr a-z A-Z <<<'one $var there'

ONE $VAR THERE

使用引号,Here String 可以接收多行字符串作为命令的输入

tr a-z A-Z <<<"one two there > four five six > seven eight"

ONE TWO THERE FOUR FIVE SIX SEVEN EIGHT

posted @ 2019-12-19 19:45  声声慢43  阅读(544)  评论(0编辑  收藏  举报