使用数据库

使用数据库

       很多情况下都希望脚本可以存储数据以便将来使用。过程,要想通过shell脚本存储和获取数据需要创建文件,从文件中读取数据、解析数据,然后将数据保存回文件。试图在文件中查找数据意味着必须读取文件中的每天记录来查找需要的数据。

       这里我们可以通过shell和数据库交互的方式,更方便地操作数据。

24.1 MySQL数据库

       安装MySQL,自动化安装比较方便,手动安装需要配置一些东东,有点小麻烦。

创建MySQL数据库对象

       在开始编写同数据库交互的shell脚本前,需要创建一些数据库对象,至少要创建以下数据对象:

l  用来存储应用数据的唯一数据库;

l  通过脚本访问数据库时使用的唯一用户账户;

l  用来阻止数据的一个或多个数据表;

创建数据库

       需要使用root用户来创建数据库:

$mysql –u root –p进入后使用$CREATE DATABASE test创建test数据库。可以使用SHOW DATABASES来查看是否创建成功;

使用use test来连接到数据库,然后可以使用SHOW TABLES来查看是否创建了表;

创建用户账户

       上面我们是使用root来操作的,大家都知道这个比较危险,所以我们需要创建普通用户,该账户只拥有访问某应用程序使用的数据库的权限,可以通过GRANT SQL语句来实现:

mysql> GRANT SELECT,INSERT,DELETE,UPDATE ON test.* TO test IDENTIFIED by ‘123456’

       语句的含义是:允许用户查询、插入、删除、更新test数据库的所有信息,并设置密码为123456

24.2 PostgreSQL数据库

       PostgreSQL数据库一开始是作为学术项目出现的,用于演示如何将先进的数据库技术结合到功能数据库服务器中,经过多年的发展,PostgreSQL已经成为可以在Linux环境下使用的最先进的开源数据库之一。

       安装方法与MySQL有点小不同。

24.3 处理表

       MySQLPostgreSQL服务器都被认为是关系数据库(relational database)。

24.3.1 创建表

例如:

mysql > CREATE TABEL emplyees{

->empid int not null,

->lastname varchar(30),

->surname varchar(30),

->salary float

->primary key(empid));

       注意,创建表需要使用root账户,因为test用户没有创建表的权限。

       其中的primary key(empid)用于定义一个数据字段来唯一标识每条记录。这就意味着每条数据记录都必须要有一个唯一的empid值。

24.3.2 插入和删除数据

test=> INSERT INTO employees VALUES(1,’daxia’,’guo’,100000000000000000.0);

24.3.3 查询数据

       查询需要使用SELECT命令,该命令功能非常强大,但随之而来的就是复杂性。

格式为SELECT datafields FROM table

       可以使用一个或多个修饰符来定义数据库服务器如何返回查询结果:

l  WHERE:显示与指定条件相匹配的记录子集;

l  OREDER BY:按指定顺序显示记录;

l  LIMIT:只显示记录的一个子集。

24.4 在脚本中使用数据库

       这里有个技巧,就是在不同的系统上找到的mysql位置可能不一样,此时可以使用which命令,在脚本中使用

MYSQL=`which mysql`就可以把mysql程序的可执行文件赋值给变量MYSQL

例如下面几个脚本测试:

其中-ptesttest为密码,这里也可以通过配置文件来修改。

test_MySQL

#!/bin/bash

#test connecting to the MySQL server

 

MYSQL=`which mysql`

 

$MYSQL test -u test -ptest -e ‘select * from emplyees’

test_MySQL_single_command  单个命令加上-e参数

#!/bin/bash

#test connecting to the MySQL server

 

MYSQL=`which mysql`

 

$MYSQL test -u test -ptest -e ‘select * from emplyees’

test_MySQL_multiple_commands  多个命令需要使用重定向,且必须定义一个文件结束字符串

#!/bin/bash

#test connecting to the MySQL server

 

MYSQL=`which mysql`

 

$MYSQL test -u test -ptest <<EOF

show tables;

select * from emplyees where firstname = ‘wang’;

EOF

test_MySQL_insert_data  从脚本插入数据到数据库

#!/bin/bash

#send data to the table in the MySQL database

 

MYSQL=`which mysql`

 

if [ $# -ne 4 ]

then

       echo "Usage : shellname empid lastname firstname salary"

else

       statement="INSERT INTO emplyees VALUES ($1,’$2′,’$3′,$4)"

       $MYSQL test -u test -ptest << EOF

       $statement

EOF

 

if [ $? -eq 0 ]

then

       echo Data successfully added

else

       echo Problem adding data

fi

fi

格式化数据

       可以通过-H参数输出HTML的格式数据,使用-X参数输出XMLExtensible Markup Language)可扩展标记语言的格式数据。

创建函数

创建函数

14.1 基本脚本函数

       函数是被赋予名称的脚本代码块,可以在代码的任意位置重用。

14.1.1 创建函数                    

       格式为:

function name

{

       commands

}

或者为:

name()

{

       commands

}

14.2 返回值

       bash shell将函数看作小型脚本,并以退出状态结束。

14.2.1 默认退出状态

       默认情况下,函数的退出状态时函数的最后一条命令返回的退出状态。这是一种比较危险的做法,因为大部分情况下,我们不会再脚本的最后编写函数。而其他语句如果正常执行的话,就不会有提示信息了。

14.2.2 使用return命令

       return命令可以使用单个整数值来定义函数的退出状态,不过要注意两个错误:

l  记住在函数完成后尽快提取返回值;

l  记住退出状态的取值范围为0~255

14.2.3 使用函数输出

       例如一个函数为test,那么可以使用result=`test`来获取任意类型的返回值。

14.3 在函数中使用变量

       默认情况下,脚本中定义的变量都是全局变量,在函数外部定义的变量,在函数内部仍能正常访问。

       在变量前面加上local就能确保变量为局部变量。

14.5 函数递归

       自给(self-containment)是局部函数变量的一个特性。自给函数除了脚本通过命令行传递的变量,不适用函数之外的任何资源。

       这种特性使函数能够以递归方式调用。

14.6 创建库

       在当前文件夹创建一个库,testlib,那么我们在脚本中只需要source ./testlib或者用点好. ./testlib即可导入该库。

14.7 在命令行中使用函数

14.7.1 在命令行创建函数

       如果是一行命令,注意每条命令的结尾必须包含分号,这样shell才知道命令在那里分开;如果是多行命令,则不需要在每条命令的结尾添加分号,只需要按下ENTER键即可。

       注意,如果命令行中创建的函数与内置命令或其他命令同名,那么自定义函数将覆盖原有命令。

basic bash shell command

基本的bash shell命令

启动shell

       启动的默认shell可以通过/etc/passwd的最后一个字段得知。

shell提示符

       启动终端模拟包或者从Linux控制台登录后,就可以访问shell CLI提示符了,提示符是通往shell的大门,是输入shell命令的地方。

       控制命令行提示符的环境变量有两个PS1PS2,可以通过ehco $PS1/2来查看。所以如果想修改提示符,只需要给PS1PS2重新赋值即可。

       Bash shell提示符字符:

转义字符

 描述

\a

ASCII 字符(alert, BELL, 0X07

\d

 日期(formatweekday month date

\D{format}

 格式化的日期和时间(由 strftime 解释格式)

\e

ASCII 字符(escape, ESC, 0X1b

\h

 主机名(主机名中 . 字符之前的部分)

\H

 完整的主机名

\j

 

\l

 当前 shell 终端设备名字(如 tty1

\n

 换行(光标停留在提示符字符串下一行第一个字符)

\r

 回车(光标停留在提示符字符串第一个字符串)

\s

shell 的名字(默认为 bash

\t

24 小时制时间(formathour:minute:second

\T

12 小时制时间(formathour:minute:second

\@

12 小时制时间(formathour:minute am/pm

\A

24 小时制时间(formathour:minute

\u

 当前登陆用户的用户名

\v

bash 的版本号(version,如 4.2

\V

bash 的发行号(version + patch level,如 4.2.24

\w

 当前工作目录

\W

 当前工作目录的文件名部分

\!

 当前命令在历史缓冲区中的位置

\#

 命令数编号(不包括空命令)

\$

 如果 $UID=0,则输出一个 # 字符,否则输出 $ 字符

\nnn

 三位八进制数字 n 表示的 ASCII 字符

\\

 反斜线

\[

 开始一个非打印字符序列(如颜色转义序列之前)

\]

 结束一个非打印字符序列(如颜色转义序列之后)

bash手册

       可以通过man命令查看相应的手册。

文件系统导航

Linux文件系统

       注意和Windows的区别,分隔符分别为/\

Linux通用目录

/usr/bin;/bin 用于存放常用的可执行文件、命令
/sbin
存放系统的可执行文件
/root
超级用户的目录
/home/user
普通用户的目录
/media/CDRom
光驱目录
/media /floppy
软驱目录
/etc
系统的主要配置文件
/tmp
普通用户或程序临时存放或者生成的文件存放点
/boot
系统内核和系统启动时所使用的文件
/dev
机器中硬件设备目录

/usr 存放系统应用程序或与命令相关的系统数据
/Lost+Found
系统异常关机或崩溃时,遗失的片段
/var
系统运行过程中经常变化的文件
/proc
驻留在内存中的虚拟文件系统
/lib,/usr/lib,/usr/local/lib
存放系统所使用的共享函数库

/mnt 挂载目录,另一个可移动媒体设备常用的挂载点

/opt 可选目录,常用于存储可选软件包

/var 可变目录,用于经常更改的文件,比如日志文件

文件和目录列表

基本列表

       ls –R 显示包含在当前目录的所有目录中的文件。

文件处理

链接文件

       链接是目录中的占位符,指向文件的真实位置。Linux中有两种不同的链接类型:

l  符号链接,又称软链接;

l  硬链接;

查看文件内容

查看文件统计数据

       stat filename :可以查看filename的文件状态的完整摘要。

查看文件类型

file filename 可以查看文件内部并确定文件的类型。

file命令将文件分为以下3类:

l  文本文件:包含可打印字符的文件;

l  可执行文件:可以在系统运行的文件;

l  数据文件:包括不可打印的二进制字符的文件,但是不可以在系统运行。

查看整个文件

       在使用more查看文件的时候,输入v就可以进入vim编辑器

查看部分文件

       tail 默认显示文件的最后10行;

       head 默认显示文件的开头10行。