您的位置:首页 > 运维架构 > Shell

shell脚本编程讲解

2012-06-19 14:49 309 查看
我们已经知道如何使用shell的命令行界面提示输入命令和查看命令结果,而shell脚本的关键可以输入多条命令,处理每一条命令的结果,甚至可以将一条命令的结果传递给另一条命令,shell可以将多条命令连接起来形成单一的步骤。
1[/b]、下面我就说说如何创建脚本文件:[/b]
要将shell命令放置在一个文本文件中,首先需要使用文本编辑器创建一个文件,然后将命令输入到该文件中,创建脚本文件是,必须在文件的第一行指明所使用的shell。格式如下:
#!/bin/bash
# This scripts displays the date and who`s logged on
date
who
在普通的shell脚本行中,#符号用作注释行,shell不处理shell脚本中的注释行,但是shell脚本中的第一行是个特例,#后面跟着!号是在告诉shell运行下列脚本的shell为bash shell,也可以用其它的shell,一般我们用bash shell,用#号添加注释行是为了方便我们以后回顾以往的工作,编辑完了上面的一个简单的小脚本之后我们可以将他们保存起来,我们可以命名为我们方便管理的文件名,这里我们命名为test1,然后我们要使bash shell能找到test1脚本文件,因为shell使用名为PATH的环境变量查找命令,要使shell能找到test1脚本文件,需要下列任意一种操作即可:
1、 将shell脚本文件所在的目录添加到PATH环境变量中;
2、 在命令提示符中使用文件的绝对路径或相对路径来引用该shell脚本。
下面我们用第二种方法将test1文件的准确路径告诉给shell,查看执行结果如下:



我们发现执行结果是错误的,提示我们没有执行test1文件的权限,我们快速的查看一下test1文件的权限:



因为我们创建新的test1文件时,umask值确定了新文件的默认权限设置,
由于umask设为022,所以系统以只读只写的权限创建了该文件,下一步我们要
赋予test1文件可执行的权限然后查看执行结果:



经过我们创建test1脚本文件、将test1文件的准确路径告诉给shell和给
予test1文件可执行权限后脚本执行成功了,通过上述讲述,我们就很轻松的
了解了shell脚本的基本编译方法。
2、显示消息:

大多数shell命令生成自己的输出,这些输出在运行该脚本的控制台监视器上显示,有时候想添加自己的文本消息以帮助脚本用户了解脚本中发生了什么,使用echo命令可以完成此操作,下面我们来了解一下echo命令的使用:
echo 用来显示回显信息;其命令选项有以下几个:
-e 解析反斜杠命令,例如\n(换行符);
-n 解除系统换行;
例如:



默认情况下不需要使用引号来标记想要显示的字符串,但是如果在字符串
中使用了引号,有时会出现问题,例:



echo命令可以用单引号或双引号来标记文本字符串;要想使上述字符串完
整的显示出来,就要对上述字符串整体使用双引号标记;执行结果如下:



-e 解析反斜杠命令,例如\n(换行符),\t(水平制表符),例:





-n 解除系统换行,例:



3、使用变量:

变量:可变化的量,有名称的内存空间,运行在进程的内存空间中;
1)bash中变量的类型:(bash中所有的变量类型都理解为字符型);
环境变量 环境变量对当前shell及其子shell都是有效的;
本地变量 (局部变量)只对当前shell有效,作用域为当前shell。
特殊变量 $? 引用上一条命令的执行状态返回值;
0 执行成功;
1-255 执行失败,其中1,2,127通常是预留的;
位置变量 位置变量用于引用传递过来的函数:通常用$1,$2....${11},...;
2)变量命名:
1、只能包含字母、数字和下划线:并且不能以数字开头;
2、不能与关键字冲突;
3、见名知义;
例:date=
stu_total=
3)变量的事先声明:
declare [options] VAR_NAME
-i 整型
-x 环境变量
-a 数组
-r 只读变量,值不能改变并且不能撤销;
声明局部变量 例:Local NAME=Jerry
声明环境变量 例:declare –x VAR_NAME=vale
export VAR_NAME=vale或printenv VAR_NAME=vale

4[/b]、输入/输出重定向和管道[/b]
[/b]程序的重要功能:读入数据—>处理—>输出数据;
定义一个默认的数据读入的设备,数据输出的设备;
0:标准输入的文件描述符,通常对应的是keyboard(键盘);
1和2:标准输出的文件描述符,通常对应的是monitor(显示器);
正确执行1,monitor;
错误执行2,monitor;
1[/b])输出重定向:[/b]
> 覆盖重定向;
>> 追加重定向;
>OUT 2>&1 将两种数据的输出流合并,例如:cat /etc/fstab >/tmp/test 2>&1;
set -C 开启禁止覆盖已存在的文件的功能;
set +C 关闭禁止覆盖已存在的文件的功能;
>| 允许覆盖,例如:cat /etc/fstab >| /tmp/test;
&> 合并输出流至同一个数据流,例如:例如:cat /etc/fstab &> /tmp/test;
2[/b])输入重定向:[/b]
< [/b]输入重定向,例如:mail -s “hello” root > /etc/fstab;[/b]
<< [/b]Here Document表示此处作为文档使用,例如:cat << EOF
hello
ni hao
EOF
表示见EOF结束
3[/b])如何自己定义文件描述符并取消文件描述符:[/b]
exec 是个内置命令,用某一个命令把这个shell进程替换掉;
exec n> /to/somewhere 定义文件描述符到某一个位置;
n>>
n< 自己定义标准输入设备;
<> 把后面的设备即是输入又是输出;
exec n>&- 关闭我们自己定义的文件描述符;
exec 3> /tmp/a 定义3这个文件描述符,把它的设备输出到/tmp/a下的a文件,例如:





4[/b])管道[/b] | 把前一个命令的输出当作后一个命令的输入 ;
COMMAND1 | COMMAND2 | COMMAND3.........
例如:



5[/b]、条件测试:[/b]
[/b][ expression ] 注意空格,单中括号是命令[/b]。
` expression ` 双中括号是关键字[/b]。
test expression

expression[/b]写法[/b]
bash[/b]的条件测试类型:[/b]
1、 整数测试;
2、 字符串测试;
3、 文件测试;
1[/b])整数测试;[/b]
双目操作:NUM1 操作符 NUM2;
-eq 等于 例如:[ 2 -eq 3 ]或` 2 -eq 3 `或test 2 -eq 3;
-gt 大于;
-lt 小于;
-ge 大于等于;
-le 小于等于;
-ne 不等于;
2[/b])字符串测试:[/b]
>,<,>=,<=,!=,==
[[]] 用于字符串比较;
单目:-z “STRING” 测试字符串是否为空;
-n “STRING” 测试字符串是否不空;
3[/b])文件测试:[/b]
-e /path/to 测试文件是否存在(/path/to可以是目录或着链接);
-f /path/to 测试文件是不是文件(/path/to可以是目录或着链接);
-d /path/to 测试文件是不是目录(/path/to可以是目录或着链接);
-r /path/to 测试是否有读权限(/path/to可以是目录或着链接);
-w /path/to 测试是否有写权限(/path/to可以是目录或着链接);
-x /path/to 测试是否有执行权限(/path/to可以是目录或着链接);
4[/b])实现算术运算:[/b]
[/b]$[expression][/b]
常用方法:
赋值给变量,例如:SUM=$[2+3];
使用echo回显,例如:echo $[2+3];
$(()),例如:SUM=$((2+3))或echo $((2+3));
let VAR_NAME=NUM1 OP NUM2,例如:let SUM=2+3;
expr 2 + 3(注意加号两边的空格);
5[/b])算术运算方式:[/b]
$[算式]:SUM=$[$SUM+$I]
$((算式)):SUM=$(($SUM+$I))
`expr 算式`:例如:SUM=`expr 算式`:SUM=`expr $SUM + $I`
(注意算术符号两边的空格[/b]);
6[/b]、命令替换[/b]
1[/b])引号的作用:[/b]
单引号:’强引用;
双引号:”变量替换;
反引号:` 命令引用,过程是命令替换的过程;
2[/b])命令替换的命令方式[/b]:[/b]
`COMMANG`或者是$(COMMAND)
变量引用:
$VAR_NAME
$(VAR_NAME)
set VAR_NAME=value
unset VAR_NAME 撤销变量;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  shell 循环 命令替换