定制自己的shell提示符

虽然parrot的shell提示符已经是很骚气了。但是作为喜欢折腾,没有麻烦制造麻烦也要上的我还是决定搞一下事情。

shell提示符的变量

提示符是由 PS1这个环境变量进行定义。我们可以使用echo $PS1命令来打印我们现在的shell命令提示符号的代码。

简单解释一些变量的含义

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
 \a 	以 ASCII 格式编码的铃声 . 当遇到这个转义序列时,计算机会发出提示声。
\d 以日,月,天格式来表示当前日期。例如,“Mon May 26.”
\h 本地机的主机名,但不带末尾的域名。
\H 完整的主机名。
\j 运行在当前 shell 会话中的工作数。
\l 当前终端设备名。
\n 一个换行符。
\r 一个回车符。
\s shell 程序名。
\t 以24小时制,hours:minutes:seconds 的格式表示当前时间.
\T 以12小时制表示当前时间。
\@ 以12小时制,AM/PM 格式来表示当前时间。
\A 以24小时制,hours:minutes 格式表示当前时间。
\u 当前用户名。
\v shell 程序的版本号。
\V Version and release numbers of the shell.
\w 当前工作目录名。
\W 当前工作目录名的最后部分。
\! 当前命令的历史号。
\# 当前 shell 会话中的命令数。
\$ 这会显示一个"$"字符,除非你拥有超级用户权限。在那种情况下, 它会显示一个"#"字符。
\[ 标志着一系列一个或多个非打印字符的开始。这被用来嵌入非打印 的控制字符,这些字符以某种方式来操作终端仿真器,比方说移动光标或者是更改文本颜色。
\] 标志着非打印字符序列结束。

文本颜色
\033[0;30m 黑色
\033[1;30m 深灰色
\033[0;31m 红色
\033[1;31m 浅红色
\033[0;32m 绿色
\033[1;32m 浅绿色
\033[0;33m 棕色
\033[1;33m 黄色
\033[0;34m 蓝色
\033[1;34m 浅蓝色
\033[0;35m 粉红
\033[1;35m 浅粉色
\033[0;36m 青色
\033[1;36m 浅青色
\033[0;37m 浅灰色
\033[1;37m 白色

背景颜色
\033[0;40m 蓝色
\033[1;44m 黑色
\033[0;41m 红色
\033[1;45m 粉红
\033[0;42m 绿色
\033[1;46m 青色
\033[0;43m 棕色
\033[1;47m 浅灰色

一般上面那一段是太长不看系列的东西,但是好像可以总结成一个公式\[\e[F;Bm\]其中“F”为字体颜色,编号30~37;“B”为背景色,编号40~47。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
   前景     背景     颜色
  30 40 黑色
  31 41 红色
  32 42 绿色
  33 43 黄色
  34 44 蓝色
  35 45 紫红色
  36 46 青蓝色
  37 47 白色

代码 意义
0 OFF
1 高亮显示
4 underline
7 反白显示
8 不可见

关于光标的行为常用的为以下几种,大家可以看看有什么可以用的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
\033[l;cH       把光标移到第 l 行,第 c 列。

\033[nA 把光标向上移动 n 行。

\033[nB 把光标向下移动 n 行。

\033[nC 把光标向前移动 n 个字符。

\033[nD 把光标向后移动 n 个字符。

\033[2J 清空屏幕,把光标移到左上角(第零行,第零列)。

\033[K 清空从光标位置到当前行末的内容。

\033[s 存储当前光标位置。

\033[u 唤醒之前存储的光标位置。
开始我们的定制

首先,我们备份当前的环境变量

ps1Old="$PS1"

然后,我们需要验证一下我们真的成功备份了这个变量

echo $ps1Old

然后修改当前的变量

[\033[0;31m]][\033[01;33m][\033[01;96m][\033[0;31m]]\342\224\200[[\033[0;32m]\t
[\033[01;96m][\033[0;31m]]\342\224\200[[\033[0;32m] 表示 红色的]-[

解释一下暂时我知道的shell默认的配置

1
\[\033[0;31m\]\342\224\214\342\224\200$([[ $? != 0 ]] && echo "[\[\033[0;31m\]\342\234\227\[\033[0;37m\]]\342\224\200")[\[\033[0;39m\]\u\[\033[01;33m\]@\[\033[01;96m\]\h\[\033[0;31m\]]\342\224\200[\[\033[0;32m\]\w\[\033[0;31m\]]\n\[\033[0;31m\]\342\224\224\342\224\200\342\224\200\342\225\274 \[\033[0m\]\[\e[01;33m\]\$\[\e[0m\]

\[\033[0;31m 表示红色`

\]\342\224\214\342\224\200 貌似是八进制转移字符,这个暂时还没查到,欢迎诸位大佬进行补充。

[\[\033[0;39m\]\u以绿色打印当前用户名

\[\033[01;33m\]@用黄色打印@字符

\[\033[01;96m\]\h 打印主机名

\[\033[0;31m\]]\342\224\200[\[\打印红色的“]-[“符号

033[0;32m\]\w打印绿色的当前目录

\[\033[0;31m\]]\n换行符
\[\e[01;33m\]\$打印$符号
\[\e[0m\]清除当前的提示符设置,以系统默认的方法来进行输出

然后大家就可以参照上面的解释来定制自己的shell提示符。,以下为我自己的提示命令

1
\[\033[1;33m\]\342\224\214\342\224\200$([[ $? != 0 ]] && echo "[\[\033[0;33m\]\342\234\227\[\033[0;37m\]]\342\224\200")[\[\033[0;39m\]\u\[\033[01;33m\]@\[\033[01;96m\]\h\[\033[0;33m\]]\342\224\200[\[\033[1;34m\]\w\[\033[01;96m\]\[\033[0;33m\]]\342\224\200[\[\033[1;31m\]\t\[\033[01;96m\]\[\033[1;33m\]]\n\[\033[0;33m\]\342\224\224\342\224\200\342\224\200\342\225\274 \[\033[0m\]\[\e[01;33m\]\$\[\e[0m\]

交换机的工作原理

之前在单位上遇到主机需要在交换机中抓包的问题了,正好给自己科普一下交换机和路由器的内容。

#####基本概念#####

在互联网中要想将网络互相连接起来要使用一些中间设备,ISO的术语称之为中继(relay)系统。根据中继系统所在的层次,在我们学的计算机网络中介绍了的七层网络模型和五层网络模型。可以有以下五种中继系统:

  1. 工作在物理层上的中继系统,即转发器(repeater)。
  2. 工作在数据链路层上的中继系统即网桥或桥接器(bridge)。
  3. 工作在网络层的中继系统,即路由器(router)。
  4. 网桥和路由器的混合物桥路器(brouter)兼有网桥和路由器的功能。
  5. 在网络层以上的中继系统,即网关(gateway).

    ARP协议:地址解析协议(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。主机发送信息时将包含目标IP地址的ARP请求广播到网络上的所有主机,并接收返回消息,以此确定目标的物理地址;收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。
    ARP欺骗:ARP协议是建立在网络中各个主机互相信任的基础上的,网络上的主机可以自主发送ARP应答消息,其他主机收到应答报文时不会检测该报文的真实性就会将其记入本机ARP缓存;由此攻击者就可以向某一主机发送伪ARP应答报文,使其发送的信息无法到达预期的主机或到达错误的主机,这就构成了一个ARP欺骗。ARP命令可用于查询本机ARP缓存中IP地址和MAC地址的对应关系、添加或删除静态对应关系等。相关协议有RARP、代理ARP。NDP用于在IPv6中代替地址解析协议。

#####交换机中的交换一词#####

交换只是一种技术上的概念:完成信号由设备入口到出口的转发。所以,所有符合该定义的设备都可以称为交换设备。
当它被用来描述数据网络第二层的设备时,实际指的是一个桥接设备;而当它被用来描述数据网络第三层的设备时,又指的是一个路由设备。
我们经常说到的以太网交换机实际是一个基于网桥技术的多端口第二层网络设备,它为数据帧从一个端口到另一个任意端口的转发提供了低时延、低开销的通路。
因此,交换机内部核心会有一个交换矩阵,为任意两端口间的通信提供通道,或是一个快速交换总线,使得由任意端口接收的数据帧可以从其他端口发出。在实际设备中,交换矩阵的功能往往由专门的芯片(ASIC)完成。
以太网第二层交换机是基于多端口网桥发展而来,但毕竟交换有其更丰富的特性,使之不但是获得更多带宽的最好途径,而且还使网络更易管理。

#####路由器#####

路由器是OSI协议模型的网络层中的分组交换设备(或网络层中继设备),路由器的基本功能是把数据(IP报文)传送到正确的网络,包括:

  • IP数据报的转发,包括数据报文的寻径和传送;
  • 子网隔离,可以抑制广播风暴;
  • 维护路由表,并与其他路由器交换路由信息,这是IP报文转发的基础。
  • IP数据报的差错处理及简单的拥塞控制;
  • 实现对IP数据报的过滤和记帐。

    #####路由和交换的区别#####
    

    交换发生在OSI参考模型的第二层(数据链路层),不会涉及到IP地址。而路由发生在第三层(网络层),会涉及到ip地址的解析。这一区别决定了路由和交换在移动信息的过程中需要使用不同的控制信息,所以两者实现各自功能的方式是不同的。

#####交换机和hub的区别#####

hub集线器本身不能识别目的地址,数据包在以HUB为架构的网络上是以广播方式传输的,简而言之,每台与hub相连的电脑都会收到经过hub的所有数据包,所以此种连接方式会共享网络带宽。

交换机拥有一条很高带宽的总线和内部交换矩阵。交换机的所有的端口都挂接在这条总线上,当控制电路收到数据包以后,处理端口会查找内存中的地址对照表以确定目的MAC地址的NIC(网卡)挂接在哪个端口上,通过内部交换矩阵迅速将数据包传送到目的端口,目的MAC若不存在才广播到所有的端口,接收端口回应后交换机会记录新的地址,并把它添加入内部MAC地址表中。
使用交换机也可以把网络“分段”,只不过是通过对照mac地址表的方式,根据MAC地址表,交换机只允许必要的网络流量通过交换机。通过交换机的过滤和转发,也可以有效的隔离广播风暴,减少误包和错包的出现,避免共享冲突。
交换机在同一时刻可进行多个端口对之间的数据传输。每一端口都可视为独立的网段,连接在其上的网络设备独自享有全部的带宽,无须同其他设备竞争使用。当节点A向节点D发送数据时,节点B可同时向节点C发送数据,而且这两个传输都享有网络的全部带宽,都有着自己的虚拟连接。假使这里使用的是10Mbps的以太网交换机,那么该交换机这时的总流通量就等于2×10Mbps=20Mbps,而使用10Mbps的共享式HUB时,一个HUB的总流通量也不会超出10Mbps。

#####交换机和路由器的区别#####

交换机中维护的是mac表,通过mac地址寻找目标。路由器维护的是路由表,通过ip地址寻找下一个目标。

#####二层交换机、三层交换机和路由器的基本工作原理#####
  1. 二层交换技术
    二层交换机是数据链路层的设备,它能够读取数据包中的MAC地址信息并根据MAC地址来进行交换。
    交换机内部有一个地址表,这个地址表标明了MAC地址和交换机端口的对应关系。当交换机从某个端口收到一个数据包,它首先读取包头中的源MAC地址,这样它就知道源MAC地址的机器是连在哪个端口上的,它再去读取包头中的目的MAC地址,并在地址表中查找相应的端口,如果表中有与这目的MAC地址对应的端口,则把数据包直接复制到这端口上,如果在表中找不到相应的端口则把数据包广播到所有端口上,当目的机器对源机器回应时,交换机又可以学习一目的MAC地址与哪个端口对应,在下次传送数据时就不再需要对所有端口进行广播了。
    二层交换机就是这样建立和维护它自己的地址表。由于二层交换机一般具有很宽的交换总线带宽,所以可以同时为很多端口进行数据交换。如果二层交换机有N个端口,每个端口的带宽是M,而它的交换机总线带宽超过N×M,那么这交换机就可以实现线速交换。二层交换机对广播包是不做限制的,把广播包复制到所有端口上。
    二层交换机一般都含有专门用于处理数据包转发的ASIC (Application specific Integrated Circuit)芯片,因此转发速度可以做到非常快。
  2. 三层交换技术
    简单来说,三层交换机就是一个带有第三层路由功能的第二层交换机,但它是二者的有机结合,并不是简单的把路由器设备的硬件及软件简单地叠加在局域网交换机上。
    从硬件上看,第二层交换机的接口模块都是通过高速背板/总线(速率可高达几十Gbit/s)交换数据的,在第三层交换机中,与路由器有关的第三层路由硬件模块也插接在高速背板/总线上,这种方式使得路由模块可以与需要路由的其他模块间高速的交换数据,从而突破了传统的外接路由器接口速率的限制。在软件方面,第三层交换机也有重大的举措,它将传统的基于软件的路由器软件进行了界定。
    其做法是:

    • 对于数据包的转发:如IP/IPX包的转发,这些规律的过程通过硬件实现。
    • 对于第三层路由软件:如路由信息的更新、路由表维护、路由计算、路由的确定等功能,用优化、高效的软件实现。
      假设两个使用IP协议的机器通过第三层交换机进行通信的过程,机器A在开始发送时,已知目的IP地址,但尚不知道在局域网上发送所需要的MAC地址。要采用地址解析(ARP)来确定目的MAC地址。机器A把自己的IP地址与目的IP地址比较,从其软件中配置的子网掩码提取出网络地址来确定目的机器是否与自己在同一子网内。若目的机器B与机器A在同一子网内,A广播一个ARP请求,B返回其MAC地址,A得到目的机器B的MAC地址后将这一地址缓存起来,并用此MAC地址封包转发数据,第二层交换模块查找MAC地址表确定将数据包发向目的端口。若两个机器不在同一子网内,如发送机器A要与目的机器C通信,发送机器A要向“缺省网关”发出ARP包,而“缺省网关”的IP地址已经在系统软件中设置。这个IP地址实际上对应第三层交换机的第三层交换模块。所以当发送机器A对“缺省网关”的IP地址广播出一个ARP请求时,若第三层交换模块在以往的通信过程中已得到目的机器C的MAC地址,则向发送机器A回复C的MAC地址;否则第三层交换模块根据路由信息向目的机器广播一个ARP请求,目的机器C得到此ARP请示后向第三层交换模块回复其MAC地址,第三层交换模块保存此地址并回复给发送机器A。以后,当再进行A与C之间数据包转发进,将用最终的目的机器的MAC地址封装,数据转发过程全部交给第二层交换处理,信息得以高速交换。既所谓的一次选路,多次交换。
      第三层交换具有以下突出特点:
      有机的硬件结合使得数据交换加速;
      优化的路由软件使 得路由过程效率提高;
      除了必要的路由决定过程外,大部分数据转发过程由第二层交换处理;
      多个子网互连时只是与第三层交换模块的逻辑连接,不象传统的外接路由器那样需增加端口,保护了用户的投资。
  3. 路由技术
    路由器是在OSI七层网络模型中的第三层——网络层操作的。
    路由器内部有一个路由表,这表标明了如果要去某个地方,下一步应该往哪走。路由器从某个端口收到一个数据包,它首先把链路层的包头去掉(拆包),读取目的IP地址,然后查找路由表,若能确定下一步往哪送,则再加上链路层的包头(打包),把该数据包转发出去;如果不能确定下一步的地址,则向源地址返回一个信息,并把这个数据包丢掉。
    路由技术和二层交换看起来有点相似,其实路由和交换之间的主要区别就是交换发生在OSI参考模型的第二层(数据链路层),而路由发生在第三层。这一区别决定了路由和交换在传送数据的过程中需要使用不同的控制信息,所以两者实现各自功能的方式是不同的。
    路由技术其实是由两项最基本的活动组成,即决定最优路径和传输数据包。其中,数据包的传输相对较为简单和直接,而路由的确定则更加复杂一些。路由算法在路由表中写入各种不同的信息,路由器会根据数据包所要到达的目的地选择最佳路径把数据包发送到可以到达该目的地的下一台路由器处。当下一台路由器接收到该数据包时,也会查看其目标地址,并使用合适的路径继续传送给后面的路由器。依次类推,直到数据包到达最终目的地。
    路由器之间可以进行相互通讯,而且可以通过传送不同类型的信息维护各自的路由表。路由更新信息主是这样一种信息,一般是由部分或全部路由表组成。通过分析其它路由器发出的路由更新信息,路由器可以掌握整个网络的拓扑结构。链路状态广播是另外一种在路由器之间传递的信息,它可以把信息发送方的链路状态及进的通知给其它路由器。
    路由器工作原理
    传统地,路由器工作于OSI七层协议中的第三层,其主要任务是接收来自一个网络接口的数据包,根据其中所含的目的地址,决定转发到下一个目的地址。因此,路由器首先得在转发路由表中查找它的目的地址,若找到了目的地址,就在数据包的帧格前添加下一个MAC地址,同时IP数据包头的TTL(Time To Live)域也开始减数,并重新计算校验和。当数据包被送到输出端口时,它需要按顺序等待,以便被传送到输出链路上。
    路由器在工作时能够按照某种路由通信协议查找设备中的路由表。如果到某一特定节点有一条以上的路径,则基本预先确定的路由准则是选择最优(或最经济)的传输路径。由于各种网络段和其相互连接情况可能会因环境变化而变化,因此路由情况的信息一般也按所使用的路由信息协议的规定而定时更新。
    网络中,每个路由器的基本功能都是按照一定的规则来动态地更新它所保持的路由表,以便保持路由信息的有效性。为了便于在网络间传送报文,路由器总是先按照预定的规则把较大的数据分解成适当大小的数据包,再将这些数据包分别通过相同或不同路径发送出去。当这些数据包按先后秩序到达目的地后,再把分解的数据包按照一定顺序包装成原有的报文形式。路由器的分层寻址功能是路由器的重要功能之一,该功能可以帮助具有很多节点站的网络来存储寻址信息,同时还能在网络间截获发送到远地网段的报文,起转发作用;选择最合理的路由,引导通信也是路由器基本功能;多协议路由器还可以连接使用不同通信协议的网络段,成为不同通信协议网络段之间的通信平台。
    一般来说,路由器的主要工作是对数据包进行存储转发,具体过程如下:

    1. 当数据包到达路由器,根据网络物理接口的类型,路由器调用相应的链路层功能模块,以解释处理此数据包的链路层协议报头。这一步处理比较简单,主要是对数据的完整性进行验证,如CRC校验、帧长度检查等。
    2. 在链路层完成对数据帧的完整性验证后,路由器开始处理此数据帧的IP层。这一过程是路由器功能的核心。根据数据帧中IP包头的目的IP地址,路由器在路由表中查找下一跳的IP地址;同时,IP数据包头的TTL(Time To Live)域开始减数,并重新计算校验和(Checksum)。
    3. 根据路由表中所查到的下一跳IP地址,将IP数据包送往相应的输出链路层,被封装上相应的链路层包头,最后经输出网络物理接口发送出去。
      简单地说,路由器的主要工作就是为经过路由器的每个数据包寻找一条最佳传输路径,并将该数据包有效地传送到目的站点。由此可见,选择最佳路径策略或叫选择最佳路由算法是路由器的关键所在。为了完成这项工作,在路由器中保存着各种传输路径的相关数据——路由表(Routing Table),供路由选择时使用。上述过程描述了路由器的主要而且关键的工作过程,但没有说明其它附加性能,例如访问控制、网络地址转换、排队优先级等。

本文准备较为匆忙,很多参考之处已忘记出处,若有错误请帮忙指出。万分感激。。。。

教堂与集市笔记归纳

不得不承认,自己选择社区有一部分原因是因为这本书。虽然现在还没做出什么贡献,但是终归要向这个目标迈进的,以下部分是在书中摘录,你我共勉
  1. 每一个好的软件的起因都是挠到了开发者本人的痒处Every good work of softWare starts by scratching a developer’s personal itch.
  2. 好的程序员知道写什么,伟大的程序员知道改写(和重复使用)什么。Good programmers know what to write.Great ones know what to rewrite(and reuse)。
  3. “计划扔掉一个,无论如何你都会扔掉一个的”(《人月神话》)。”Plan to throw one away,you will ,anyhow”.
  4. 如果你有正确的态度,有意思的问题会找上你。If you have the right attitude ,intesting problems will find you .
  5. 当你对一个项目失去兴趣时,你的最后的职责是把它交给一个称职的继承者。When you lose interest in a program,your last duty to it is to hand it off to a competent successor.
  6. 把用户像合作者来对待是通往快速改进代码和有效调试的最佳通道。Treating your users as co-developers is your least-hassle route to rapid code improvement and effective debugging.
  7. 早发布,常发布,听取用户的意见。Release early. Release often. And listen to your customers.
  8. 如果beta测试者和合作开发者的群体足够大的话,几乎每个问题都会快速显现,会有人轻而易举的把它解决。Given a large enough beta-tester and co-developer base, almost every problem will be characterized quickly and the fix obvious to someone.
  9. 好的数据结构和差的代码要比反过来搭配好的多(即差的数据结构和好的代码)Smart data structures and dumb code works a lot better than the other way around.
  10. 如果你以“最有价值的资源”来对待你的beta测试者,他们会以成为“最有价值的资源”来回应你的期望。If you treat your beta-testers as if they’re your most valuabel resource, they will respond by becoming your most valuable resource.
  11. 仅次于拥有好的主意的是认识到来自用户的好主意,有时候后者会更好一些。The next best thing to having good ideas is recongizing good ideas from your users.Sometimes the latter is better.
  12. 最有突破和创新的方案常常来自于意识到你把问题的模型弄错了。Often, the most striking and innovative solution come from realizing that your concept of the problem was wrong.
  13. 设计达到完美的时候,不是增加得不能再增加了,而是减少得不能再减少了。PerfectionI(in design)is achieved not when there is nothing more to add , but rather when there is nothing more to take away.
  14. 任何一个工具都应该达到预期的用处,但是一个真正棒的工具会带来你从来预期不到的用处。Any tool should be useful in the expected way, but a truly great tool lends itself to uses you never expected.
  15. 在写关口软件的时候,花点功夫尽可能不要干扰数据流——除非用户强迫你,永远不要扔掉任何数据。When writing gateway software of any kind,take pains to disturbthe data stream as little as possible–and never throw away information unless the recipient forces you to !
  16. 当你的语言离图灵穷尽还差得远的时候,给语法加点料是有帮助的。When your language is nowhere near Turing-comlete,syntatic sugar can be your friend.
  17. 一个安全系统的安全性取决于它保守秘密的安全性。小心伪秘密。A security system is only as secure as its secret.Beware of pseudo-secrets.
  18. 当你开始进行社区建设的时候,你需要能够呈现一个可行的前景,你的程序不一定要能够工作的非常好,他可以是粗糙的,问题多多的,不完整的,缺少文档的。但是它必须是可以运行的和能够说服潜在的合作者在可预见的将来进化成为真正漂亮的东西。
  19. 要解决一个有意思的问题,首先你要找到一个你觉得有意思的问题。To solve an interesting problem,start by finding a problem that is interesting to you.
  20. 如果说一个项目已经延期,那么向项目组里添加程序员的做法会导致已经延期的项目更加延期。
  21. 如果开发的协调者有一个至少和互联网一样好的通讯媒介,并且懂得如何不通过强迫来领导,多个头脑将会不可避免的优于单个头脑的价值。Provided the development co ordinator has communications medium at least as good as the Internet,and knows how to lead without coercion,many heads are inevitably better than one.
  22. 开源文化会最终胜利,或许不是因为合作在道德上正确或者软件“劳役”在道德上错误。而只是因为开源社区可以在一个问题上投入多几个数量级的技术工时,闭源世界无法赢得这场进化式的军备竞争。

Markdown格式(转)

1.如果要在文档中插入一个版权符号 ©,可以这样写:

©

2.一个 Markdown 段落是由一个或多个连续的文本行组成,它的前后要有一个以上的空行(空行的定义是显示上看起来像是空的,便会被视为空行。比方说,若某一行只包含空格和制表符,则该行也会被视为空行)。普通段落不该用空格或制表符来缩进。

3.标题
Markdown 支持两种标题的语法,类 Setext 和类 atx 形式。

类 Setext 形式是用底线的形式,利用 = (最高阶标题)和 - (第二阶标题),例如:

This is an H1

This is an H1
=============

This is an H2

This is an H2
-------------

任何数量的 = 和 - 都可以有效果。

类 Atx 形式则是在行首插入 1 到 6 个 # ,对应到标题 1 到 6 阶,例如:

# 这是 H1

## 这是 H2

###### 这是 H6

这是 H1

这是 H2

这是 H6

你可以选择性地「闭合」类 atx 样式的标题,这纯粹只是美观用的,若是觉得这样看起来比较舒适,你就可以在行尾加上 #,而行尾的 # 数量也不用和开头一样(行首的井字符数量决定标题的阶数):

区块引用 Blockquotes
Markdown 标记区块引用是使用类似 email 中用 > 的引用方式。如果你还熟悉在 email 信件中的引言部分,你就知道怎么在 Markdown 文件中建立一个区块引用,那会看起来像是你自己先断好行,然后在每行的最前面加上 > :

> This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet,
> consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus.
> Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus.
>
> Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse
> id sem consectetuer libero luctus adipiscing.
Markdown 也允许你偷懒只在整个段落的第一行最前面加上 > :

> This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet,
consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus.
Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus.

> Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse
id sem consectetuer libero luctus adipiscing.
区块引用可以嵌套(例如:引用内的引用),只要根据层次加上不同数量的 > :

> This is the first level of quoting.
>
> > This is nested blockquote.
>
> Back to the first level.
引用的区块内也可以使用其他的 Markdown 语法,包括标题、列表、代码区块等:

> ## 这是一个标题。
>    
> 1.   这是第一行列表项。
> 2.   这是第二行列表项。
>
> 给出一些例子代码:
>
>     return shell_exec("echo $input | $markdown_script");
任何像样的文本编辑器都能轻松地建立 email 型的引用。例如在 BBEdit 中,你可以选取文字后然后从选单中选择增加引 用阶层。

This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet,
consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus.
Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus.

Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse
id sem consectetuer libero luctus adipiscing.
Markdown 也允许你偷懒只在整个段落的第一行最前面加上 > :

This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet,
consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus.
Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus.

Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse
id sem consectetuer libero luctus adipiscing.
区块引用可以嵌套(例如:引用内的引用),只要根据层次加上不同数量的 > :

This is the first level of quoting.

This is nested blockquote.

Back to the first level.
引用的区块内也可以使用其他的 Markdown 语法,包括标题、列表、代码区块等:

这是一个标题。

  1. 这是第一行列表项。
  2. 这是第二行列表项。

给出一些例子代码:

return shell_exec("echo $input | $markdown_script");

任何像样的文本编辑器都能轻松地建立 email 型的引用。例如在 BBEdit 中,你可以选取文字后然后从选单中选择增加引用阶层。

列表
Markdown 支持有序列表和无序列表。

无序列表使用星号、加号或是减号作为列表标记:

*   Red
*   Green
*   Blue
等同于:

+   Red
+   Green
+   Blue
也等同于:

-   Red
-   Green
-   Blue
  • Red
  • Green
  • Blue
    等同于:
  • Red
  • Green
  • Blue
    也等同于:
  • Red
  • Green
  • Blue
    有序列表则使用数字接着一个英文句点:

    1. Bird
    2. McHale
    3. Parish
  1. Bird
  2. McHale
  3. Parish

很重要的一点是,你在列表标记上使用的数字并不会影响输出的 HTML 结果,上面的列表所产生的 HTML 标记为:

代码区块
和程序相关的写作或是标签语言原始码通常会有已经排版好的代码区块,通常这些区块我们并不希望它以一般段落文件的方式去排版,而是照原来的样子显示

要在 Markdown 中建立代码区块很简单,只要简单地缩进 4 个空格或是 1 个制表符就可以,例如,下面的输入:

一个代码区块会一直持续到没有缩进的那一行(或是文件结尾)。

分隔线
你可以在一行中用三个以上的星号、减号、底线来建立一个分隔线,行内不能有其他东西。你也可以在星号或是减号中间插入空格。下面每种写法都可以建立分隔线:

* * *

***

*****

- - -

区段元素
链接
Markdown 支持两种形式的链接语法: 行内式和参考式两种形式。

不管是哪一种,链接文字都是用 [方括号] 来标记。

要建立一个行内式的链接,只要在方块括号后面紧接着圆括号并插入网址链接即可,如果你还想要加上链接的 title 文字,只要在网址后面,用双引号把 title 文字包起来即可,例如:

This is [an example](http://example.com/ "Title") inline link.
[This link](http://example.net/) has no title attribute.

This is an example inline link.

This link has no title attribute.

链接内容定义的形式为:

  • 方括号(前面可以选择性地加上至多三个空格来缩进),里面输入链接文字
  • 接着一个冒号
  • 接着一个以上的空格或制表符
  • 接着链接的网址
  • 选择性地接着 title 内容,可以用单引号、双引号或是括弧包着
  • 下面这三种链接的定义都是相同:
[foo]: http://example.com/  "Optional Title Here"

强调
Markdown 使用星号()和底线(_)作为标记强调字词的符号,被 包围的字词会被转成用 标签包围,用两个 * 或 包起来的话,则会被转成 ,例如:

*single asterisks*
_single underscores_

single asterisks

single underscores

**double asterisks**
__double underscores__

double asterisks

double underscores

强调也可以直接插在文字中间:

unfriggingbelievable
但是如果你的 * 和 _ 两边都有空白的话,它们就只会被当成普通的符号。

如果要在文字前后直接插入普通的星号或底线,你可以用反斜线:

\*this text is surrounded by literal asterisks\*

代码
如果要标记一小段行内代码,你可以用反引号把它包起来(`),例如:

Use the `printf()` function.

会产生:

Use the printf() function.

前加加和后加加的区别

// 前缀形式: (++i)

int& int::operator++() //这里返回的是一个引用,说明函数返回值也可以作为一个左值使用
    {//函数本身无参,说明是在函数体内加1
        *this += 1;  
         return *this;  
    }

//后缀形式:(i++)

const int int::operator++(int) //函数返回值是一个非左值,与前缀形有所差别
{//函数带参,会新建一个临时空间
    int oldValue = *this;  
    ++(*this); // 增加
    return oldValue;  
}

综上所述,前加加要比后加加略微快一丢丢

一个好的编程小习惯

一个好习惯:为了加强可读性和避免隐含依赖,应使用下面的顺序:C标准库、C++标准库、其它库的头文件、你自己工程的头文件。不过这里最先包含的是首选的头文件,即例如a.cpp文件中应该优先包含a.h。首选的头文件是为了减少隐藏依赖,同时确保头文件和实现文件是匹配的。

从上到下:
1、该cpp的头文件
2、C标准库
3、C++标准库
4、其他框架
5、其他库
6、自己工程的头文件

,