418 lines
18 KiB
HTML
418 lines
18 KiB
HTML
|
<!DOCTYPE html>
|
|||
|
<html lang="en">
|
|||
|
<head>
|
|||
|
<meta charset="utf-8">
|
|||
|
<title>Introduction a bash en tant que language de programmation.</title>
|
|||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|||
|
<meta name="author" content="wxcafé">
|
|||
|
<link rel="icon" type="image/png" href="file:///home/wxcafe/code/blog-source/output/theme/img/favicon.ico">
|
|||
|
<!-- Le styles -->
|
|||
|
<link rel="stylesheet" href="file:///home/wxcafe/code/blog-source/output/theme/css/bootstrap.css" type="text/css" />
|
|||
|
<link href='http://fonts.googleapis.com/css?family=Oswald&subset=latin,latin-ext' rel='stylesheet' type='text/css'>
|
|||
|
<script type="text/javascript">
|
|||
|
/* <![CDATA[ */
|
|||
|
(function() {
|
|||
|
var s = document.createElement('script');
|
|||
|
var t = document.getElementsByTagName('script')[0];
|
|||
|
|
|||
|
s.type = 'text/javascript';
|
|||
|
s.async = true;
|
|||
|
s.src = '//api.flattr.com/js/0.6/load.js?'+
|
|||
|
'mode=auto&uid=wxcafe&button=compact&popout=0';
|
|||
|
t.parentNode.insertBefore(s, t);
|
|||
|
})();
|
|||
|
/* ]]> */
|
|||
|
</script> <!-- flattr button loader -->
|
|||
|
<style type="text/css">
|
|||
|
body {
|
|||
|
padding-top: 60px;
|
|||
|
padding-bottom: 40px;
|
|||
|
}
|
|||
|
.sidebar-nav {
|
|||
|
padding: 9px 0;
|
|||
|
}
|
|||
|
.tag-1 {
|
|||
|
font-size: 13pt;
|
|||
|
}
|
|||
|
.tag-2 {
|
|||
|
font-size: 10pt;
|
|||
|
}
|
|||
|
.tag-2 {
|
|||
|
font-size: 8pt;
|
|||
|
}
|
|||
|
.tag-4 {
|
|||
|
font-size: 6pt;
|
|||
|
}
|
|||
|
</style>
|
|||
|
<link href="file:///home/wxcafe/code/blog-source/output/theme/css/bootstrap-responsive.css" rel="stylesheet">
|
|||
|
<link href="file:///home/wxcafe/code/blog-source/output/theme/css/font-awesome.css" rel="stylesheet">
|
|||
|
<link href="file:///home/wxcafe/code/blog-source/output/theme/css/pygments.css" rel="stylesheet">
|
|||
|
<!-- Le fav and touch icons -->
|
|||
|
<link rel="shortcut icon" href="file:///home/wxcafe/code/blog-source/output/theme/images/favicon.ico">
|
|||
|
|
|||
|
<link href="file:///home/wxcafe/code/blog-source/output/feeds/feed.rss.xml" type="application/atom+xml" rel="alternate" title="Wxcafé RSS Feed" />
|
|||
|
|
|||
|
</head>
|
|||
|
|
|||
|
<body>
|
|||
|
|
|||
|
<div class="navbar navbar-fixed-top">
|
|||
|
<div class="navbar-inner">
|
|||
|
<div class="container-fluid">
|
|||
|
<a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
|
|||
|
<span class="icon-bar"></span>
|
|||
|
<span class="icon-bar"></span>
|
|||
|
<span class="icon-bar"></span>
|
|||
|
</a>
|
|||
|
<a class="brand" href="file:///home/wxcafe/code/blog-source/output/index.html">Wxcafé </a>
|
|||
|
<div class="nav-collapse">
|
|||
|
<ul class="nav">
|
|||
|
<li><a href="file:///home/wxcafe/code/blog-source/output/archives.html"><i class="icon-th-list"></i> Archives</a></li>
|
|||
|
<li><a href="file:///home/wxcafe/code/blog-source/output/pages/about/">A propos</a></li>
|
|||
|
<li class="divider-vertical"></li>
|
|||
|
<ul class="nav pull-right">
|
|||
|
</ul>
|
|||
|
</ul>
|
|||
|
</div><!--/.nav-collapse -->
|
|||
|
</div>
|
|||
|
</div>
|
|||
|
</div>
|
|||
|
|
|||
|
<div class="container-fluid">
|
|||
|
<div class="row">
|
|||
|
<div class="span9" id="content">
|
|||
|
<section id="content">
|
|||
|
<article>
|
|||
|
<header>
|
|||
|
<h1>
|
|||
|
<a href=""
|
|||
|
rel="bookmark"
|
|||
|
title="Permalink to Introduction a bash en tant que language de programmation.">Introduction a bash en tant que language de programmation.</a>
|
|||
|
</h1>
|
|||
|
</header>
|
|||
|
<div class="entry-content">
|
|||
|
<div class="well">
|
|||
|
<footer class="post-info">
|
|||
|
<span class="label">Date</span>
|
|||
|
<span class="published" title="2012-09-08T18:15:00+02:00">
|
|||
|
<i class="icon-calendar"></i> Sat 08 September 2012
|
|||
|
</span>
|
|||
|
<br />
|
|||
|
<span class="label">By</span>
|
|||
|
<a href="file:///home/wxcafe/code/blog-source/output/author/wxcafe.html"><i class="icon-user"></i>Wxcafe</a>
|
|||
|
<br />
|
|||
|
<span class="label">Category</span>
|
|||
|
<a href="file:///home/wxcafe/code/blog-source/output/category/programmation/"><i class="icon-folder-open"></i>Programmation</a>
|
|||
|
<br />
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
</footer><!-- /.post-info --> </div>
|
|||
|
<p>L’interpréteur de commandes bash (Bourne Again SHell)
|
|||
|
est possiblement le shell le plus connu, notamment grâce a son
|
|||
|
intégration en tant que shell par défaut dans les distributions Linux
|
|||
|
les plus répandues (Debian - Ubuntu, Fedora, OpenSUSE, Mandriva -
|
|||
|
Mageia, etc...).</p>
|
|||
|
<p>Cependant, il n'est souvent connu qu'en tant qu’interpréteur de
|
|||
|
commande. Alors qu'en réalité, le bash est un langage de programmation
|
|||
|
(presque) complet! Ainsi, il intègre les structures de contrôle
|
|||
|
habituelles ( pour mémoire, les structures de contrôle comprennent les
|
|||
|
conditions (les ifs), les boucles (les while), et les choix (les case),
|
|||
|
entre autres.), et est donc ce que l'on pourrait appeler un langage de
|
|||
|
script, interprété, de la même façon que python, a la difference près
|
|||
|
qu'il contient un prompt (un système d'entrée de commande interactif)
|
|||
|
bien plus complet et développé que python. </p>
|
|||
|
<p>Cependant, les programmes en bash ne sont executables que dans un
|
|||
|
environnement de type UNIX, et donc pas sous Windows (cygwin
|
|||
|
(cygwin.com) propose ceci dit un système permettant d'utiliser bash sous
|
|||
|
windows. Il faut malgré tout convenir que cet environnement est bien
|
|||
|
plus compliqué a manipuler, et globalement ne permet pas d'acceder a des
|
|||
|
portages de qualité satisfaisante.)</p>
|
|||
|
<p>Ainsi, il est possible de créer des fichiers .sh, contenant des
|
|||
|
instructions bash mises a la suite (de la même façon qu'un script BATCH
|
|||
|
Windows .bat), et faisant appel autant aux commandes internes de bash,
|
|||
|
aussi bien que les commandes externes mises en place par les programmes
|
|||
|
installés sur le système, exactement comme dans une invite de commande.
|
|||
|
Ainsi, pour appeller firefox, la commande 'firefox' lancera le petit
|
|||
|
panda roux directement dans la boite magique, tandis qu'un if
|
|||
|
[condition] suivi d'un then (quelque chose) lancera le fameux quelque
|
|||
|
chose suscité si la condition est vérifiée. Un peu comme en C, quoi. </p>
|
|||
|
<p>De cette façon, et avec quelques informations et connaissances, il est
|
|||
|
facile de comprendre le fonctionnement de la programmation en bash.
|
|||
|
Quelques exemples commentés:</p>
|
|||
|
<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
|
|||
|
2
|
|||
|
3
|
|||
|
4
|
|||
|
5
|
|||
|
6
|
|||
|
7
|
|||
|
8
|
|||
|
9
|
|||
|
10
|
|||
|
11
|
|||
|
12
|
|||
|
13</pre></div></td><td class="code"><div class="highlight"><pre><span class="c">#!/bin/bash </span>
|
|||
|
<span class="c"># La ligne du dessus est très importante, c'est elle qui dit a bash quel doit être </span>
|
|||
|
<span class="c"># l'interpreteur des commandes écrites dans ce script. Ici, on dit a bash d'interpréter </span>
|
|||
|
<span class="c"># lui même les commandes comprises dans ce script. On aurait tout de fois pu lui faire </span>
|
|||
|
<span class="c"># executer du python, par exemple, en mettant #!/usr/bin/python a la place.</span>
|
|||
|
<span class="nb">echo</span> <span class="s2">"this is a test of bash as a simple script manager"</span> <span class="c"># echo est une commande d'affichage de message.</span>
|
|||
|
<span class="nb">echo</span> <span class="s2">"what's your name, user?"</span>
|
|||
|
<span class="nb">read </span>your_name <span class="c"># la commande read permet de demander a l'utilisateur de donner une </span>
|
|||
|
<span class="c"># information, stockée dans la variable en paramètre. </span>
|
|||
|
<span class="nb">echo</span> <span class="nv">$your_name</span> <span class="s2">"is your name"</span> <span class="c"># echo permet aussi d'afficher la valeur de variables. </span>
|
|||
|
<span class="c"># Ici, on renvoie la variable remplie précédemment, suivie d'un message. </span>
|
|||
|
<span class="nb">exit</span> <span class="c"># cet appel a exit n'est pas obligatoire, mais donne un aspect plus </span>
|
|||
|
<span class="c"># propre au code. Il ne quittera pas la session de terminal, cependant.</span>
|
|||
|
</pre></div>
|
|||
|
</td></tr></table>
|
|||
|
|
|||
|
<p>Voila. Ce script bash ne sert pas a grand chose, mais il a le mérite
|
|||
|
d'être clair quand aux capacités et a la simplicité du bash en tant que
|
|||
|
language de programmation. Alors en effet, nous n'avons ici absolument
|
|||
|
pas utilisé les capacités de bash en lui même, et n'avons fait que le
|
|||
|
renvoyer a des programmes externes (sauf read, il est vrai). Voyons
|
|||
|
maintenant la syntaxe de bash quand il s'agit d'utiliser les structures
|
|||
|
de contrôle:</p>
|
|||
|
<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
|
|||
|
2
|
|||
|
3
|
|||
|
4
|
|||
|
5
|
|||
|
6
|
|||
|
7
|
|||
|
8
|
|||
|
9
|
|||
|
10</pre></div></td><td class="code"><div class="highlight"><pre><span class="c">#!/bin/bash </span>
|
|||
|
<span class="nb">echo</span> <span class="s2">"welcome to this second bash program. would you please kindly enter the name of the machine you're running this on?"</span>
|
|||
|
<span class="nb">read </span>host_name
|
|||
|
<span class="k">if</span> <span class="o">[</span> <span class="nv">$host_name</span> <span class="o">==</span> <span class="nv">$HOSTNAME</span> <span class="o">]</span> <span class="c">## voici la syntaxe du if. Attention a bien penser a mettre les espaces avant la première variable, et après la seconde. La variable $HOSTNAME ici utilisée est une variable présente par défaut sur le système. </span>
|
|||
|
<span class="k">then </span><span class="nb">echo</span> <span class="s2">"you told the truth!"</span>
|
|||
|
<span class="k">fi</span> <span class="c">## le fi est la commande fermant le if, tout comme le EndIf en basic. C'est un peu vieillot, mais important en bash. </span>
|
|||
|
<span class="k">if</span> <span class="o">[</span> <span class="nv">$host_name</span> !<span class="o">=</span> <span class="nv">$HOSTNAME</span> <span class="o">]</span> <span class="c">## l'opérateur != est l'inverse de ==, il vérifie donc si les deux variables ne sont pas les mêmes. </span>
|
|||
|
<span class="k">then </span><span class="nb">echo</span> <span class="s2">"you lied!"</span>
|
|||
|
<span class="k">fi </span>
|
|||
|
<span class="nb">exit</span>
|
|||
|
</pre></div>
|
|||
|
</td></tr></table>
|
|||
|
|
|||
|
<p>Voila un petit programme permettant d'apprendre la syntaxe du if en
|
|||
|
bash. comme vous pouvez le voir, le language est plutôt lite, et la
|
|||
|
structure if n'est pas très difficile a prendre en main.</p>
|
|||
|
<p>Passons maintenant au while:</p>
|
|||
|
<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre>1
|
|||
|
2
|
|||
|
3
|
|||
|
4
|
|||
|
5
|
|||
|
6
|
|||
|
7</pre></div></td><td class="code"><div class="highlight"><pre><span class="c">#!/bin/bash</span>
|
|||
|
<span class="nb">echo</span> <span class="s2">"what is your name?"</span>
|
|||
|
<span class="nb">read </span>name
|
|||
|
<span class="k">while</span> <span class="o">[</span> 1 < 10 <span class="o">]</span> <span class="c">## le while se présente sous la forme while (truc); do (machin); done. Les [] sont en fait des programmes differents, inclus dans bash.</span>
|
|||
|
<span class="k">do </span><span class="nb">echo</span> <span class="s2">"i love"</span> <span class="nv">$name</span>
|
|||
|
<span class="k">done</span>
|
|||
|
<span class="nb">exit</span>
|
|||
|
</pre></div>
|
|||
|
</td></tr></table>
|
|||
|
|
|||
|
<p>Ce petit programme permet d'observer les bases de while (qui est la
|
|||
|
boucle de base en bash).</p>
|
|||
|
<p>Le troisième opérateur de bash est case. Voyons:</p>
|
|||
|
<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
|
|||
|
2
|
|||
|
3
|
|||
|
4
|
|||
|
5
|
|||
|
6
|
|||
|
7
|
|||
|
8
|
|||
|
9
|
|||
|
10
|
|||
|
11
|
|||
|
12
|
|||
|
13
|
|||
|
14
|
|||
|
15
|
|||
|
16
|
|||
|
17
|
|||
|
18
|
|||
|
19
|
|||
|
20
|
|||
|
21
|
|||
|
22
|
|||
|
23
|
|||
|
24</pre></div></td><td class="code"><div class="highlight"><pre><span class="c">#!/bin/bash</span>
|
|||
|
<span class="nb">echo</span> <span class="s2">"please enter a number between one and five"</span>
|
|||
|
<span class="nb">read </span>number
|
|||
|
<span class="k">case</span> <span class="nv">$number</span> in
|
|||
|
1<span class="o">)</span>
|
|||
|
<span class="nb">echo</span> <span class="s2">"the choosen number was one"</span>
|
|||
|
;;
|
|||
|
2<span class="o">)</span>
|
|||
|
<span class="nb">echo</span> <span class="s2">"the choosen number was two"</span>
|
|||
|
;;
|
|||
|
3<span class="o">)</span>
|
|||
|
<span class="nb">echo</span> <span class="s2">"the choosen number was three"</span>
|
|||
|
;;
|
|||
|
4<span class="o">)</span>
|
|||
|
<span class="nb">echo</span> <span class="s2">"the choosen number was four"</span>
|
|||
|
;;
|
|||
|
5<span class="o">)</span>
|
|||
|
<span class="nb">echo</span> <span class="s2">"the choosen number was five"</span>
|
|||
|
;;
|
|||
|
*<span class="o">)</span>
|
|||
|
<span class="nb">echo</span> <span class="s2">"this number is not correct"</span>
|
|||
|
;;
|
|||
|
<span class="k">esac</span>
|
|||
|
<span class="nb">exit</span>
|
|||
|
</pre></div>
|
|||
|
</td></tr></table>
|
|||
|
|
|||
|
<p>case est un opérateur plus complexe a utiliser a bon escient, et sert a
|
|||
|
faire des ifs multiples sans avoir a taper des dizaines de lignes de
|
|||
|
code.<br />
|
|||
|
(pour ceux qui auraient du mal avec cet opérateur, il faut comprendre
|
|||
|
que le code vérifie chacune des conditions : le 1) est validé si la
|
|||
|
valeur de \$number est 1, le 2) est validé si cette valeur est 2, etc..
|
|||
|
le *) désigne toutes les valeurs, et est donc validé si aucune autre
|
|||
|
valeur n'a précédemment acceptée.</p>
|
|||
|
<p>Quelques notions manquent ici:<br />
|
|||
|
- les nombres aléatoires sont générés par un appel a la variable
|
|||
|
\$RANDOM, qui renvoie un nombre aléatoire entre 0 et 32767 (un entier a
|
|||
|
16 bits donc). il est possible de faire des invocations a des nombres
|
|||
|
aléatoires plus grands, mais les méthodes permettant de faire cela sont
|
|||
|
plus complexes, et je ne les aborderai donc pas ici.<br />
|
|||
|
- comme vous avez pu le constater, les variables sont désignées en tant
|
|||
|
que telles par l'utilisation d'un symbole \$ au début de leur nom.
|
|||
|
Ainsi, echo number renverra "number", tandis que echo \$number renverra
|
|||
|
le résultat de la variable \$number.<br />
|
|||
|
être utilisées dans un programme bash.<br />
|
|||
|
- comme vous avez pu le constater, les commandes doivent tenir en
|
|||
|
théorie en une ligne. Cependant, le caractère \ permet de retourner a
|
|||
|
la ligne en faisant considérer a bash qu'il s'agit de la même ligne.</p>
|
|||
|
<p>Globalement, il faut admettre que bash n'a pas vocation a être un
|
|||
|
langage de programmation extrêmement développé. Sans framework
|
|||
|
graphique, avec peu de manières d'utiliser de grandes variables, ou
|
|||
|
encore une gestion de la mémoire risible, bash n'a rien d'un langage de
|
|||
|
développement professionnel.<br />
|
|||
|
Cependant, le simple fait qu'il soit considéré comme un langage de
|
|||
|
programmation a part entière font de lui un langage de script d'une
|
|||
|
puissance incontestable, et sa simplicité et sa grande popularité font
|
|||
|
de lui un langage de choix pour apprendre la programmation simplement et
|
|||
|
sans trop se prendre la tête.</p>
|
|||
|
<p>J'espère que cet article aura été utile a certain-e-s, et je vous
|
|||
|
souhaite bonne chance dans votre découverte de la programmation (n'allez
|
|||
|
pas voir ceux qui font de l'orienté objet, c'est des méchants :3)</p>
|
|||
|
</div><!-- /.entry-content -->
|
|||
|
</article>
|
|||
|
</section>
|
|||
|
</div><!--/span-->
|
|||
|
<div class="span3 well sidebar-nav" id="sidebar">
|
|||
|
<ul class="nav nav-list">
|
|||
|
|
|||
|
|
|||
|
<!-- Categories links -->
|
|||
|
<li class="nav-header"><h4><i class="icon-folder-close icon-large"></i> Categories</h4></li>
|
|||
|
<li>
|
|||
|
<a href="file:///home/wxcafe/code/blog-source/output/category/hacking/">
|
|||
|
<i class="icon-folder-open icon-large"></i>Hacking
|
|||
|
</a>
|
|||
|
</li>
|
|||
|
<li>
|
|||
|
<a href="file:///home/wxcafe/code/blog-source/output/category/language/">
|
|||
|
<i class="icon-folder-open icon-large"></i>Language
|
|||
|
</a>
|
|||
|
</li>
|
|||
|
<li>
|
|||
|
<a href="file:///home/wxcafe/code/blog-source/output/category/notes/">
|
|||
|
<i class="icon-folder-open icon-large"></i>Notes
|
|||
|
</a>
|
|||
|
</li>
|
|||
|
<li>
|
|||
|
<a href="file:///home/wxcafe/code/blog-source/output/category/oses/">
|
|||
|
<i class="icon-folder-open icon-large"></i>OSes
|
|||
|
</a>
|
|||
|
</li>
|
|||
|
<li>
|
|||
|
<a href="file:///home/wxcafe/code/blog-source/output/category/programmation/">
|
|||
|
<i class="icon-folder-open icon-large"></i>Programmation
|
|||
|
</a>
|
|||
|
</li>
|
|||
|
<li>
|
|||
|
<a href="file:///home/wxcafe/code/blog-source/output/category/ranting/">
|
|||
|
<i class="icon-folder-open icon-large"></i>Ranting
|
|||
|
</a>
|
|||
|
</li>
|
|||
|
<li>
|
|||
|
<a href="file:///home/wxcafe/code/blog-source/output/category/teaching/">
|
|||
|
<i class="icon-folder-open icon-large"></i>Teaching
|
|||
|
</a>
|
|||
|
</li>
|
|||
|
<li>
|
|||
|
<a href="file:///home/wxcafe/code/blog-source/output/category/tutorial/">
|
|||
|
<i class="icon-folder-open icon-large"></i>Tutorial
|
|||
|
</a>
|
|||
|
</li>
|
|||
|
<li>
|
|||
|
<a href="file:///home/wxcafe/code/blog-source/output/category/tutoriel/">
|
|||
|
<i class="icon-folder-open icon-large"></i>Tutoriel
|
|||
|
</a>
|
|||
|
</li>
|
|||
|
<li>
|
|||
|
<a href="file:///home/wxcafe/code/blog-source/output/category/vidya-games/">
|
|||
|
<i class="icon-folder-open icon-large"></i>Vidya Games
|
|||
|
</a>
|
|||
|
</li>
|
|||
|
<hr>
|
|||
|
|
|||
|
<!-- Social links -->
|
|||
|
<li class="nav-header"><h4><i class="icon-exchange"></i> social</h4></li>
|
|||
|
<a class="FlattrButton" style="display:none;"
|
|||
|
title="file:///home/wxcafe/code/blog-source/output"
|
|||
|
style="padding-top: 10px;"
|
|||
|
rel="flattr;
|
|||
|
url:file:///home/wxcafe/code/blog-source/output;
|
|||
|
title:file:///home/wxcafe/code/blog-source/output;
|
|||
|
button:compact;
|
|||
|
popout:0;
|
|||
|
uid:wxcafe;
|
|||
|
category:blog;"
|
|||
|
href="file:///home/wxcafe/code/blog-source/output">flattr</a>
|
|||
|
<li><a href="https://twitter.com/wxcafe"><i class="icon-twitter icon-large"></i> Twitter</a></li>
|
|||
|
<li><a href="https://github.com/wxcafe"><i class="icon-github icon-large"></i> Github</a></li>
|
|||
|
<li><a href="mailto://wxcafe@wxcafe.net"><i class="icon-envelope icon-large"></i> Email</a></li>
|
|||
|
<li><a href="https://data.wxcafe.net/wxcafe.asc"><i class="icon-key icon-large"></i> Gpg</a></li>
|
|||
|
<li><a href="finger://wxcafe@wxcafe.net"><i class="icon-terminal icon-large"></i> Finger</a></li>
|
|||
|
<li><a href="http://leloop.org/where.html"><i class="icon-map-marker icon-large"></i> IRL</a></li>
|
|||
|
|
|||
|
<hr>
|
|||
|
|
|||
|
<!-- Links -->
|
|||
|
<li class="nav-header"><h4><i class="icon-external-link"></i> Links</h4></li>
|
|||
|
<li><a href="https://github.com/wxcafe/blog-source"><i class="icon-code icon-large "></i> Source!</a></li>
|
|||
|
<li><a href="http://paste.wxcafe.net"><i class="icon-paste icon-large "></i> Zerobin</a></li>
|
|||
|
<li><a href="http://git.wxcafe.net"><i class="icon-github-sign icon-large "></i> Public Git</a></li>
|
|||
|
<hr>
|
|||
|
|
|||
|
<!--- RSS feed -->
|
|||
|
<li class="nav-header"><h4><i class="icon-rss"></i> feeds</h4></li>
|
|||
|
<li><a href="file:///home/wxcafe/code/blog-source/output/feeds/feed.rss.xml" rel="alternate"><i class="icon-bookmark-empty icon-large"></i> RSS</a></li>
|
|||
|
<li><a href="file:///home/wxcafe/code/blog-source/output/feeds/feed.atom.xml" rel="alternate"><i class="icon-bookmark-empty icon-large"></i> Atom</a></li>
|
|||
|
|
|||
|
|
|||
|
</ul> </div><!--/.well -->
|
|||
|
</div><!--/row-->
|
|||
|
<hr>
|
|||
|
<footer>
|
|||
|
<address id="about">
|
|||
|
Proudly powered by <a href="http://pelican.notmyidea.org/">Pelican</a>,
|
|||
|
which takes great advantage of <a href="http://python.org">Python</a>.<br />
|
|||
|
Powered by <a href="https://github.com/getpelican/pelican-themes/tree/master/bootstrap2">bootstrap2</a> theme, thanks!
|
|||
|
</address>
|
|||
|
</footer>
|
|||
|
</div><!--/.fluid-container-->
|
|||
|
</body>
|
|||
|
</html>
|