C语言&Python&Bash:空白(空格、水平制表符、换行符)与转义字符

C语言

空白

        C语言中的空白(空格、水平制表符、换行符)被用于分隔Token,因此Token间可以有任意多个空白。

// 例1
printf("Hello, World!");

       例1中存在5个Token,分别是:

  • printf
  • (
  • "Hello, World! \n"
  • )
  •         将例1写成例2的形式也是可以的,虽然它比较丑陋。

    // 例2
    printf (
    "Hello, World!"
     )
        ;

    转义字符

            在C语言中,转义字符是一种特殊的字符序列,用于表示序列有特殊含义,转义字符以反斜杠(\)开头,一般紧接一个特定字符,某些情况下可能会接多达三个字符,它的用法有:

    1、在字符串常量或字符常量中表示一些特殊字符

    \n 换行符
    \t 水平制表符
    \r 回车符
    \b 退格符
    \a 响铃符
    \f 换页符
    \v 垂直制表符
    \\ 反斜杠
    \' 单引号
    \" 双引号
    \? 问号
    \0 空字符
    \x** 十六进制表示法
    \*** 八进制表示法

    2、转义换行符,或者说连接两行

            如果某行代码以转义字符加换行符结尾,C预处理器会将该换行符删去并将其下一行拼接到上一行的后面,这是在Token解析之前进行的,因此可以用于将一个Token分成多行(Token间的换行对Token解析没有影响),如例3所示。

    // 例2
    prin\
    tf (
    "Hello, \
    World!"
     )
        ;

            除了以上两种情况外,转义字符不能接其他字符。

    Python

    空白

            Python中的空白(空格、水平制表符)被用于分隔Token,因此Token间可以有任意多个空白,而换行符(其实它在Python中被认为是一个Token)的功能根据其所在的位置的不同而异:

            1、当换行符在末尾时(且前面没有转义字符),用于表示一条简单语句的结束。

            2、当换行符在圆括号、方括号、花括号内时,用于分隔Token。

    // 例3
    print("Hello, World!")

            例3中存在5个Token,分别是: 

  • print
  • (
  • "Hello, World! \n"
  • )
  • 换行符
  •         将例3写成例4的形式也是可以的,虽然它比较丑陋。

    // 例4
    print (
    "Hello, World!"    )

    转义字符

            在Python中,转义字符是一种特殊的字符序列,用于表示序列有特殊含义,转义字符以反斜杠(\)开头,一般紧接一个特定字符,某些情况下可能会接多个字符,它的用法有:

    1、在字符串常或字符常量中表示一些特殊字符

    \n 换行符
    \t 水平制表符
    \r 回车符
    \b 退格符
    \a 响铃符
    \f 换页符
    \v 垂直制表符
    \\ 反斜杠
    \' 单引号
    \" 双引号
    \0 空字符
    \x** 十六进制表示法
    \*** 八进制表示法
    \N{name} 以Unicode数据库中字符名表示
    \u**** 16位的Unicode字符
    \U******** 32位的Unicode字符

            如果字符串前有r或R,则表示创建原始字符串,忽略\的转义功能。

    2、转义换行符,或者说连接两行

            如果某行代码以转义字符加换行符结尾,Python会将该换行符删去并将其下一行拼接到上一行的后面,这是在Token解析后进行的,因此不能用于将一个Token分成多行(除字符串Token外),如例5所示。

    // 例5
    printf (
    "Hello, \
    World!"
     )

            除了以上两种情况外,转义字符不能接其他字符。 

    Bash

    空白

            Bash中的空白(空格、水平制表符)被用于分隔Token(即命令、选项和参数),因此Token间可以有任意多个空白,而换行符的功能根据其所在的位置的不同而异:

            1、当换行符在末尾时(且前面没有转义字符、没有被引号包括),用于表示一条简单语句的结束。

            2、当被引号包括时,换行符只表示其本意即换行。

    // 例6
    echo 111 222 333

            例6中存在5个Token,分别是: 

  • echo
  • 111
  • 222
  • 333
  • 换行符
  • 转义字符

            在Bash中,转义字符是一种特殊的字符序列,用于表示序列有特殊含义,转义字符以反斜杠(\)开头,一般紧接一个特定字符,某些情况下可能会接多个字符,它的用法有: 

    1、转义空白

            默认情况下,空白被用于分隔Token,但如果空白前有转义字符,则空白会被认为是Token的一部分,如例7所示。

    // 例7
    echo 111 222 333        // 四个Token
    输出:111 222 333    
     
    echo 111\ \ 222\ \ 333  // 两个Token
    输出:111  222  333

    2、转义特殊字符

            转义字符可以转义一些特殊字符,让它们保留字面值,如例8所示。

    // 例8
    a=test
    echo \$a       
    输出:$a
    
    echo \*
    输出:*
    
    echo \|
    输出:|
    
    echo \&
    输出:&
    
    a=test
    echo \\$a       
    输出:\test
    
    echo \"111\"
    输出:"111"
    
    echo 111 \#111
    输出:111 #111

    3、禁用别名替换

            如果一条命令的第一个Token(即命令名)被转义(任意一个字符)了,则其不会进行别名替换,如例9所示。

    // 例9
    alias echo='echo 111'
    echo 222
    输出:111 222
    \echo 222
    输出:222
    ec\ho 222
    输出:222

    4、在引号中的转义行为

    双引号

            在双引号中,转义字符只针对特定特殊字符有效($、`、"和自身\),如例10所示。

    // 例10
    echo "Cost: \$100, she said \"Hello!\", uses \`command\`, shows \\, \common character."
    输出:Cost: $100, she said "Hello!", uses `command`, shows \, common character.

    单引号

            转义字符在单引号中失去转义的能力(实际上所有字符都会被当作字面量),如例11所示。

    // 例11
    echo '1111\'
    输出:1111\

    在单引号的特殊语法中表示特殊字符

            当使用$'…..'语法时,支持ANSI-C风格的转义字符。

    \n 换行符
    \t 水平制表符
    \r 回车符
    \b 退格符
    \a 响铃符
    \f 换页符
    \v 垂直制表符
    \\ 反斜杠
    \' 单引号
    \" 双引号
    \? 问号
    \x** 十六进制表示法
    \*** 八进制表示法
    \u**** 16位的Unicode字符
    \U******** 32位的Unicode字符

            下面以\n作为例子说明了这一语法。

    // 例12
    a='111\n222'
    b="111\n222"
    c=$'111\n222'
    
    echo $a
    输出:111\n222
    
    echo -e $a
    输出:
    111
    222
    
    echo $b
    输出:
    111 222
    
    echo "$b"
    输出:
    111
    222
    
    echo $c
    输出:
    111 222
    
    echo "$c"
    输出:
    111
    222

            如果不使用$'…..'语法,\n被认为是一个字面量,所以直接使用echo输出时,可以看到\n,如果使用echo -e,则表示对输出结果进行分析,将其中的转义字符进行替换。

            如果使用$'…..'语法,\n会被替换为换行符,但由于变量替换后会进行Token重解析(word splitting),换行符会被认为用来分隔Token,只有将其包围在双引号中,才能阻止Token重解析,并成功输出换行符,有关Token重解析的进一步内容,见下面的博客。

    Linux:执行命令的命令eval与Bash解析命令的方式https://chenzhang.blog.csdn.net/article/details/136943802

    5、转义换行符,或者说连接两行

            如果某行代码以转义字符加换行符结尾,Bash会将该换行符删去并将其下一行拼接到上一行的后面,这是在Token解析之前进行的,因此可以用于将一个Token分成多行(Token间的换行对Token解析没有影响),如例13所示。

    // 例13
    e\
    c\
    h\
    o\
     nihao  // 注意开头的空格
    输出:nihao

            除了以上五种情况外,转义字符也能接其他字符,但不会有特殊作用,如例14所示。

    // 例14
    echo \nihao
    输出:nihao

    作者:日晨难再

    物联沃分享整理
    物联沃-IOTWORD物联网 » C语言&Python&Bash:空白(空格、水平制表符、换行符)与转义字符

    发表回复