引号和转义

Bash 只有一种数据类型,就是字符串。不管用户输入什么数据,Bash 都认为这是字符串。所以,Bash 如何处理字符串是重点学习的内容。

echo 命令

echo命令的作用是输出一行文本,可以将命令的参数原样输出。

$ echo hello world
hello world

默认情况下,echo输出的文本末尾会有一个回车符。

-n参数可以取消输出末尾的回车符,导致下一行的提示符出紧跟在输出内容的后面。

$ echo -n hello world
hello world$

Js中文网周刊 - 领略前端技术前沿 一个收集JavaScript 新闻和精选文章的周刊

上面命令中,world后面直接就是下一行的提示符。

再看下面的例子。

$ echo a;echo b
a
b
$ echo -n a;echo b
ab

上面代码中,-n参数可以让两个echo命令的输出连在一起,出现在同一行。

-e参数表示会解释引号里面的特殊字符(比如换行符\n),不管是双引号还是单引号。默认情况下,引号会让特殊字符变成普通字符,echo不解释它们,原样输出。

$ echo "Hello\nWorld"
Hello\nWorld

$ echo -e "Hello\nWorld"
Hello
World

$ echo -e 'Hello\nWorld'
Hello
World

上面代码中,-e参数使得\n解释为换行符,导致输出内容里面出现换行。

空格

Bash 使用空格区分不同的参数。

$ command foo bar

上面命令中,foobar之间有一个空格,所以 Bash 认为它们是两个参数。

如果参数之间有多个空格,Bash 会自动忽略多余的空格。

$ echo this is a     test
this is a test

上面命令中,atest之间有多个空格,Bash 会忽略多余的空格。

双引号

如果命令的参数放在双引号中,会使得 Bash 的特殊字符失去特殊含义,变成普通字符。

$ echo "*"
*

上面命令中,通配符*放在双引号之中,就变成了普通字符,会原样输入。

由于双引号将换行符解释为普通字符,所以可以利用双引号,在命令行输入多行文本。

$ echo "hello
> world"
hello
world

上面命令中,Bash 正常情况下会将换行符解释为命令结束,但是换行符在双引号之中就是普通字符,所以可以输入多行。echo命令会将换行符原样输出,显示的时候正常解释为换行。

如果文件名包含空格,就可以把它放在双引号之中。

$ ls "two words.txt"

上面命令中,two words.txt是一个包含空格的文件名,否则就会被 Bash 当作两个文件。

双引号会原样保存多余的空格。

$ echo "this is a     test"
this is a     test

如果在双引号之中,还要插入双引号,必须使用反斜杠转义。

$ echo "he said \"hello\"."
he said "hello".

有三个字符在双引号之中,不会失去本身的特殊含义:美元符号“$”、反斜杠“\”和反引号“`”。

$ echo "$USER $((2+2)) $(cal)"

上面命令中,双引号对变量、算术运算和子命令都没有影响,它们会先执行,然后再通过echo命令输出。

双引号之中,如果想让美元符号、斜杠和反引号变成普通字符,可以在它们前面加上反斜杠。

$ echo "The balance for user $USER is: \$5.00"
The balance for user me is: $5.00

双引号还可以一个作用,就是保存原始命令的输出格式。

# 单行输出
$ echo $(cal)
一月 2020 日 一 二 三 四 五 六 1 2 3 ... 31

# 原始格式输出
$ echo "$(cal)"
      一月 2020
日 一 二 三 四 五 六
          1  2  3  4
 5  6  7  8  9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

Js中文网周刊 - 领略前端技术前沿 一个收集JavaScript 新闻和精选文章的周刊

上面命令中,如果$(cal)不放在双引号之中,echo就会将所有结果以单行输出,丢弃了所有原始的格式。

单引号

单引号的用法与双引号很类似,除了不会对美元符号、斜杠和反引号转义。也就是说,单引号之中所有字符都会变成普通字符。

$ echo '*'
*

$ echo '$USER'
$USER

$ echo '$((2+2))'
$((2+2))

$ echo '$(echo foo)'
$(echo foo)

上面命令中,单引号使得 Bash 扩展、变量引用、算术运算和子命令,都失效了。

如果单引号之中,还要使用单引号,需要使用反斜杠转移,然后在字符串前面加上一个美元符号($)。

$ echo $'I\'m a student.'
I\'m a student.

转义

参数之中的特殊符号,都可以用反斜线转义,使其变成普通字符。

$ mv bad\&filename good_filename

上面命令中,文件名bad&filename之中有一个 Bash 的特殊字符&,引用的时候需要用反斜杠转义。

如果需要对反斜线本身转义,则需要连续使用两个反斜线(//)。

$ echo \\
\

反斜线还可以用来在命令行表示特殊符号。

  • \a:响铃
  • \b:退格
  • \n:换行
  • \r:回车
  • \t:制表符

echo命令的-e参数,可以解释双引号之中的这些特殊符号。

$ echo "Time's up\n"
Time's up\n

$ echo -e "Time's up\n"
Time's up

上面命令中,双引号会让特殊字符\n变成普通字符。echo命令的-e参数则会正确解释这些特殊字符。

Here 字符串

Here 字符串是一种输入多行字符串的方法,格式如下。

[command] << token
字
符
串
内
容
token

它的格式分成开始标记和结束标记。开始标记是两个小于号 + Here 字符串的名称,名称可以随意取;结束标记是单独一行的 Here 字符串名称。两者之间就是多行字符串的内容。

下面是一个输出 HTML 代码的例子。

$ cat << _EOF_
<html>
<head>
    <title>
    The title of your page
    </title>
</head>

<body>
    Your page content goes here.
</body>
</html>
_EOF_

看完两件小事

如果你觉得这篇文章对你挺有启发,我想请你帮我两个小忙:

  1. 关注我们的 GitHub 博客,让我们成为长期关系
  2. 把这篇文章分享给你的朋友 / 交流群,让更多的人看到,一起进步,一起成长!
  3. 关注公众号 「IT平头哥联盟」,公众号后台回复「资源」 免费领取我精心整理的前端进阶资源教程

JS中文网是中国领先的新一代开发者社区和专业的技术媒体,一个帮助开发者成长的社区,目前已经覆盖和服务了超过 300 万开发者,你每天都可以在这里找到技术世界的头条内容。欢迎热爱技术的你一起加入交流与学习,JS中文网的使命是帮助开发者用代码改变世界

results matching ""

    No results matching ""