当前位置: 技术问答>linux和unix
学着编写BASH,但是还是不怎么了解原理,大家帮忙!
来源: 互联网 发布时间:2015-11-04
本文导语: 要写个BASH,将一个数据库中的数据,每天导出到另一个数据库中的一个表中,两个数据库都是ORACLE,我刚开始学,不知道从何下手!大家能不能给点建议?谢谢了! | 这个不是bash的事情,关...
要写个BASH,将一个数据库中的数据,每天导出到另一个数据库中的一个表中,两个数据库都是ORACLE,我刚开始学,不知道从何下手!大家能不能给点建议?谢谢了!
|
这个不是bash的事情,关键是oracle脚本编程
你写一个.sql的脚本
然后写一个bash脚本调用sqlplus
sqlplus xxx/xxx@xxx @你的脚本
在crontab中设置这个脚本定期运行就可以了
你写一个.sql的脚本
然后写一个bash脚本调用sqlplus
sqlplus xxx/xxx@xxx @你的脚本
在crontab中设置这个脚本定期运行就可以了
|
第5章外壳编程
在DOS 中,你可能会从事一些例行的重复性命令,此时你会将这些重复性的命令写成批
处理命令,只要执行这个批处理命令就等于执行这些命令。在L i n u x系统中也有类似的批处理
命令,它的功能比起D O S的批处理命令更为强大,相对也较为复杂,已经和一般的高级语言不
相上下。这些批处理命令在L i n u x中叫做外壳脚本(外壳Script )。
外壳脚本是以文本方式储存的,而非二进制文件。所以外壳脚本必须在L i n u x系统的外壳
下解释执行。不同外壳的脚本大多会有一些差异,所以我们不能将写给A 外壳的脚本用B 外壳
执行。而在L i n u x系统中大家最常使用是Bourne 外壳以及C 外壳,所以本章结合这两个外壳的
相同点和不同点来介绍外壳编程。
5.1 创建和运行外壳程序
5.1.1 创建外壳程序
你可以用任何的编辑器编辑外壳程序,只需将要执行的外壳或L i n u x命令写入外壳程序即
可。例如,假设你的系统在启动时挂接有一台CD-ROM 驱动器,而你想更换驱动器中的CD ,
并读取其中的内容。一种方法是:首先把想要读取的CD 放入CD-ROM 驱动器中,然后使用
unmount 命令卸载CD-ROM 驱动器,最后再使用mount 命令挂接CD-ROM 驱动器。命令如下:
umount /dev/cdrom
mount -t iso9660 /dev/cdrom /cdrom
你可以创建一个包含这两个命令的文件名为remount 的外壳程序,而不必在每次更换C D
都重复执行这两个命令。
5.1.2 运行外壳程序
如何运行我们已经写好的外壳脚本呢?可以有四种方法,下面分别介绍这几种方法:
1. 可以把外壳脚本的权限设置为可执行,这样就可以在外壳提示符下直接执行。我们可以
使用下列命令更改外壳脚本的权限∶
chmod u+x filename 只有自己可以执行,其他人不能执行。
chmod ug+x filename 只有自己以及同一工作组的人可以执行,其他人不能执行。
chmod +x filename 所有人都可以执行。
而我们如何指定使用哪一个外壳来解释执行外壳脚本呢?几种基本的指定方式如下所述∶
1) 如果外壳脚本的第一个非空白字符不是“ #”,则它会使用Bourne 外壳。
2) 如果外壳脚本的第一个非空白字符是“ #”,但不以“# !”开头时,则它会使用C 外壳。
3) 如果外壳脚本以“# !”开头,则“ # !”后面所跟的字符串就是所使用的外壳的绝对路径
第二篇L i n u x高级语言及管理编程
名。Bourne 外壳的路径名称为/bin/sh ,而C 外壳则为/ b i n / c s h。
例如:
1) 如使用Bourne 外壳,可用以下方式:
echo enter filename
或者
#!/bin/sh
2) 如使用C 外壳,可用以下方式:
# C 外壳S c r i p t
或者
# ! / b i n / c s h
3) 如使用/etc/perl 作为外壳,可用以下方式:
#! /etc/perl
2. 第二种方法是执行外壳脚本想要执行的外壳,其后跟随外壳脚本的文件名作为命令行参
数。例如,使用tcsh 执行上面的外壳脚本:
tcsh remount
此命令启动一个新的外壳,并令其执行remount 文件。
3. 第三种方法是在pdksh 和b a s h下使用. 命令,或在t c s h下使用source 命令。例如,在p d k s h
和b a s h下执行上面的外壳脚本:
. r e m o u n t
或在t c s h下执行上面的外壳脚本:
source remount
4. 第四种方法是使用命令替换。
这是一个相当有用的方法。如果想要使某个命令的输出成为另一个命令的参数时,就可以
使用这个方法。我们将命令列于两个` 号之间,而外壳会以这个命令执行后的输出结果代替这
个命令以及两个` 符号。例如:
str='Current directory is '`pwd`
echo $str
结果如下∶
Current directory is /users/cc/mgtsai
在上面的例子中,pwd 这个命令输出/ u s e r s / c c / m g t s a i,而后整个字符串代替原来的‘ p w d’
设定str 变量,所以str 变量的内容则会包括pwd 命令的输出。
5.2 使用外壳变量
就像其他的任何高级语言一样,在外壳脚本中使用变量也是十分重要的。
5.2.1 给变量赋值
在pdksh 和b a s h中,给变量赋值的方法是一样的,既在变量名后跟着等号和变量值。例如,
想要把5赋给变量c o u n t,则使用如下的命令:
count=5 (注意,在等号的两边不能有空格)
在t c s h中,可以使用如下的命令:
set count = 5
因为外壳语言是一种不需要类型检查的解释语言,所以在使用变量之前无须事先定义,这
36计计第二篇Linux高级语言及管理编程
下载
和C 或P a s c a l语言不一样。这也说明你可以使用同一个变量来存储字符串或整数。给字符串赋
值的方法和给整数赋值的方法一样。例如:
n a m e = G a r r y (在pdksh 和b a s h中)
set name = Garry (在t c s h中)
5.2.2 读取变量的值
可以使用$读取变量的值。例如,用如下的命令将count 变量的内容输出到屏幕上:
echo $count
5.2.3 位置变量和其他系统变量
位置变量用来存储外壳程序后面所跟的参数。第一个参数存储在变量1中,第二个参数存
储在变量2中,依次类推。这些变量为系统保留变量,所以你不能为这些变量赋值。同样,你
可以使用$来读取这些变量的值。例如,你可以编写一个外壳程序r e v e r s e,执行过程中它有两
个变量。输出时,将两个变量的位置颠倒。
#program reverse, prints the command line parameters out in reverse order
echo "$2" "$1"
在外壳下执行此外壳程序:
reverse hello there
其输出如下:
there hello
除了位置变量以外,还有其他的一些系统变量,下面分别加以说明:
. 有些变量在启动外壳时就已经存在于系统中,你可以使用这些系统变量,并且可以赋予
新值:
$HOME 用户自己的目录。
$ PATH 执行命令时所搜寻的目录。
$TZ 时区。
$MAILCHECK 每隔多少秒检查是否有新的邮件。
$ P S 1 在外壳命令行的提示符。
$ P S 2 当命令尚未打完时,外壳要求再输入时的提示符。
$ M A N PATHman 指令的搜寻路径。
. 有些变量在执行外壳程序时系统就设置好了,并且你不能加以修改:
$ # 存储外壳程序中命令行参数的个数。
$ ? 存储上一个执行命令的返回值。
$ 0 存储外壳程序的程序名。
$ * 存储外壳程序的所有参数。
“$ @” 存储所有命令行输入的参数,分别表示为(“$ 1” “$ 2” . . . )。
$ $ 存储外壳程序的P I D。
$ ! 存储上一个后台执行命令的P I D。
5.2.4 引号的作用
在外壳编程中,各种不同的引号之间的区别是十分重要的。单引号( ‘ ’)、双引号(“”)和
第5章计外壳编程计计37
下载
反斜杠()都用作转义。
. 这三者之中,双引号的功能最弱。当你把字符串用双引号括起来时,外壳将忽略字符串
中的空格,但其他的字符都将继续起作用。双引号在将多于一个单词的字符串赋给一个
变量时尤其有用。例如,把字符串hello there赋给变量g r e e t i n g时,应当使用下面的命令:
greeting="hello there" (在bash 和p d k s h环境下)
set greeting = "hello there" (在t c s h环境下)
这两个命令将hello there作为一个单词存储在greeting 变量中。如果没有双引号, bash 和
p d k s h将产生语法错,而t c s h则将hello 赋给变量greeting 。
. 单引号的功能则最强。当你把字符串用单引号括起来时,外壳将忽视所有单引号中的特
殊字符。例如,如果你想把登录时的用户名也包括在g r e e t i n g变量中,应该使用下面的命
令:
greeting="hello there $LOGNAME" (在bash 和p d k s h环境下)
set greeting="hello there $LOGNAME" (在t c s h环境下)
这将会把hello there root存储在变量greeting 中,如果你是以root 身份登录的话。但如果你
在上面使用单引号,则单引号将会忽略$符号的真正作用,而把字符串hello there $LOGNAME
存储在greeting 变量中。
. 使用反斜杠是第三种使特殊字符发生转义的方法。反斜杠的功能和单引号一样,只是反
斜杠每次只能使一个字符发生转义,而不是使整个字符串发生转义。请看下面的例子:
greeting=hello there (在b a s h和p d k s h环境下)
set greeting=hello there (在t c s h环境下)
在命令中,反斜杠使外壳忽略空格,从而将hello there作为一个单词赋予变量g r e e t i n g。
当你想要将一个特殊的字符包含在一个字符串中时,反斜杠就会特别地有用。例如,你想
把一盒磁盘的价格$ 5 . 0 0赋予变量d i s k _ p r i c e,则使用如下的命令:
d i s k _ p r i c e = $ 5 . 0 0 (在bash 和p d k s h环境下)
set disk_price = $5.00 (在t c s h环境下)
如果没有反斜杠,外壳就会试图寻找变量5,并把变量5的值赋给d i s k _ p r i c e。
在DOS 中,你可能会从事一些例行的重复性命令,此时你会将这些重复性的命令写成批
处理命令,只要执行这个批处理命令就等于执行这些命令。在L i n u x系统中也有类似的批处理
命令,它的功能比起D O S的批处理命令更为强大,相对也较为复杂,已经和一般的高级语言不
相上下。这些批处理命令在L i n u x中叫做外壳脚本(外壳Script )。
外壳脚本是以文本方式储存的,而非二进制文件。所以外壳脚本必须在L i n u x系统的外壳
下解释执行。不同外壳的脚本大多会有一些差异,所以我们不能将写给A 外壳的脚本用B 外壳
执行。而在L i n u x系统中大家最常使用是Bourne 外壳以及C 外壳,所以本章结合这两个外壳的
相同点和不同点来介绍外壳编程。
5.1 创建和运行外壳程序
5.1.1 创建外壳程序
你可以用任何的编辑器编辑外壳程序,只需将要执行的外壳或L i n u x命令写入外壳程序即
可。例如,假设你的系统在启动时挂接有一台CD-ROM 驱动器,而你想更换驱动器中的CD ,
并读取其中的内容。一种方法是:首先把想要读取的CD 放入CD-ROM 驱动器中,然后使用
unmount 命令卸载CD-ROM 驱动器,最后再使用mount 命令挂接CD-ROM 驱动器。命令如下:
umount /dev/cdrom
mount -t iso9660 /dev/cdrom /cdrom
你可以创建一个包含这两个命令的文件名为remount 的外壳程序,而不必在每次更换C D
都重复执行这两个命令。
5.1.2 运行外壳程序
如何运行我们已经写好的外壳脚本呢?可以有四种方法,下面分别介绍这几种方法:
1. 可以把外壳脚本的权限设置为可执行,这样就可以在外壳提示符下直接执行。我们可以
使用下列命令更改外壳脚本的权限∶
chmod u+x filename 只有自己可以执行,其他人不能执行。
chmod ug+x filename 只有自己以及同一工作组的人可以执行,其他人不能执行。
chmod +x filename 所有人都可以执行。
而我们如何指定使用哪一个外壳来解释执行外壳脚本呢?几种基本的指定方式如下所述∶
1) 如果外壳脚本的第一个非空白字符不是“ #”,则它会使用Bourne 外壳。
2) 如果外壳脚本的第一个非空白字符是“ #”,但不以“# !”开头时,则它会使用C 外壳。
3) 如果外壳脚本以“# !”开头,则“ # !”后面所跟的字符串就是所使用的外壳的绝对路径
第二篇L i n u x高级语言及管理编程
名。Bourne 外壳的路径名称为/bin/sh ,而C 外壳则为/ b i n / c s h。
例如:
1) 如使用Bourne 外壳,可用以下方式:
echo enter filename
或者
#!/bin/sh
2) 如使用C 外壳,可用以下方式:
# C 外壳S c r i p t
或者
# ! / b i n / c s h
3) 如使用/etc/perl 作为外壳,可用以下方式:
#! /etc/perl
2. 第二种方法是执行外壳脚本想要执行的外壳,其后跟随外壳脚本的文件名作为命令行参
数。例如,使用tcsh 执行上面的外壳脚本:
tcsh remount
此命令启动一个新的外壳,并令其执行remount 文件。
3. 第三种方法是在pdksh 和b a s h下使用. 命令,或在t c s h下使用source 命令。例如,在p d k s h
和b a s h下执行上面的外壳脚本:
. r e m o u n t
或在t c s h下执行上面的外壳脚本:
source remount
4. 第四种方法是使用命令替换。
这是一个相当有用的方法。如果想要使某个命令的输出成为另一个命令的参数时,就可以
使用这个方法。我们将命令列于两个` 号之间,而外壳会以这个命令执行后的输出结果代替这
个命令以及两个` 符号。例如:
str='Current directory is '`pwd`
echo $str
结果如下∶
Current directory is /users/cc/mgtsai
在上面的例子中,pwd 这个命令输出/ u s e r s / c c / m g t s a i,而后整个字符串代替原来的‘ p w d’
设定str 变量,所以str 变量的内容则会包括pwd 命令的输出。
5.2 使用外壳变量
就像其他的任何高级语言一样,在外壳脚本中使用变量也是十分重要的。
5.2.1 给变量赋值
在pdksh 和b a s h中,给变量赋值的方法是一样的,既在变量名后跟着等号和变量值。例如,
想要把5赋给变量c o u n t,则使用如下的命令:
count=5 (注意,在等号的两边不能有空格)
在t c s h中,可以使用如下的命令:
set count = 5
因为外壳语言是一种不需要类型检查的解释语言,所以在使用变量之前无须事先定义,这
36计计第二篇Linux高级语言及管理编程
下载
和C 或P a s c a l语言不一样。这也说明你可以使用同一个变量来存储字符串或整数。给字符串赋
值的方法和给整数赋值的方法一样。例如:
n a m e = G a r r y (在pdksh 和b a s h中)
set name = Garry (在t c s h中)
5.2.2 读取变量的值
可以使用$读取变量的值。例如,用如下的命令将count 变量的内容输出到屏幕上:
echo $count
5.2.3 位置变量和其他系统变量
位置变量用来存储外壳程序后面所跟的参数。第一个参数存储在变量1中,第二个参数存
储在变量2中,依次类推。这些变量为系统保留变量,所以你不能为这些变量赋值。同样,你
可以使用$来读取这些变量的值。例如,你可以编写一个外壳程序r e v e r s e,执行过程中它有两
个变量。输出时,将两个变量的位置颠倒。
#program reverse, prints the command line parameters out in reverse order
echo "$2" "$1"
在外壳下执行此外壳程序:
reverse hello there
其输出如下:
there hello
除了位置变量以外,还有其他的一些系统变量,下面分别加以说明:
. 有些变量在启动外壳时就已经存在于系统中,你可以使用这些系统变量,并且可以赋予
新值:
$HOME 用户自己的目录。
$ PATH 执行命令时所搜寻的目录。
$TZ 时区。
$MAILCHECK 每隔多少秒检查是否有新的邮件。
$ P S 1 在外壳命令行的提示符。
$ P S 2 当命令尚未打完时,外壳要求再输入时的提示符。
$ M A N PATHman 指令的搜寻路径。
. 有些变量在执行外壳程序时系统就设置好了,并且你不能加以修改:
$ # 存储外壳程序中命令行参数的个数。
$ ? 存储上一个执行命令的返回值。
$ 0 存储外壳程序的程序名。
$ * 存储外壳程序的所有参数。
“$ @” 存储所有命令行输入的参数,分别表示为(“$ 1” “$ 2” . . . )。
$ $ 存储外壳程序的P I D。
$ ! 存储上一个后台执行命令的P I D。
5.2.4 引号的作用
在外壳编程中,各种不同的引号之间的区别是十分重要的。单引号( ‘ ’)、双引号(“”)和
第5章计外壳编程计计37
下载
反斜杠()都用作转义。
. 这三者之中,双引号的功能最弱。当你把字符串用双引号括起来时,外壳将忽略字符串
中的空格,但其他的字符都将继续起作用。双引号在将多于一个单词的字符串赋给一个
变量时尤其有用。例如,把字符串hello there赋给变量g r e e t i n g时,应当使用下面的命令:
greeting="hello there" (在bash 和p d k s h环境下)
set greeting = "hello there" (在t c s h环境下)
这两个命令将hello there作为一个单词存储在greeting 变量中。如果没有双引号, bash 和
p d k s h将产生语法错,而t c s h则将hello 赋给变量greeting 。
. 单引号的功能则最强。当你把字符串用单引号括起来时,外壳将忽视所有单引号中的特
殊字符。例如,如果你想把登录时的用户名也包括在g r e e t i n g变量中,应该使用下面的命
令:
greeting="hello there $LOGNAME" (在bash 和p d k s h环境下)
set greeting="hello there $LOGNAME" (在t c s h环境下)
这将会把hello there root存储在变量greeting 中,如果你是以root 身份登录的话。但如果你
在上面使用单引号,则单引号将会忽略$符号的真正作用,而把字符串hello there $LOGNAME
存储在greeting 变量中。
. 使用反斜杠是第三种使特殊字符发生转义的方法。反斜杠的功能和单引号一样,只是反
斜杠每次只能使一个字符发生转义,而不是使整个字符串发生转义。请看下面的例子:
greeting=hello there (在b a s h和p d k s h环境下)
set greeting=hello there (在t c s h环境下)
在命令中,反斜杠使外壳忽略空格,从而将hello there作为一个单词赋予变量g r e e t i n g。
当你想要将一个特殊的字符包含在一个字符串中时,反斜杠就会特别地有用。例如,你想
把一盒磁盘的价格$ 5 . 0 0赋予变量d i s k _ p r i c e,则使用如下的命令:
d i s k _ p r i c e = $ 5 . 0 0 (在bash 和p d k s h环境下)
set disk_price = $5.00 (在t c s h环境下)
如果没有反斜杠,外壳就会试图寻找变量5,并把变量5的值赋给d i s k _ p r i c e。