linux下shell编程(二)------修订版

来源:互联网 发布:开启式电机铭牌数据 编辑:程序博客网 时间:2024/04/18 18:12

该笔记为本人原创,若要转载,请注明 出处...........

Shell解释功能常有两种:

1. 单条命令 -----交互式的

2. Shell脚本------顺序执行(诸如系统的一些配置问文件都是由shell脚本构成

Shell程序

第一章:重点掌握:局部变量,全局变量,位置参量,数组

变量:大小写敏感,本地变量,环境变量

第一个变量:a=10--------------局部变量,echo $a打印变量

本地变量(局部变量)不能被继承,全局变量可以被继承-------------shell脚本中不能打印局部变量

全局变量 export  a------------声明全局变量

显示变量的值:echo $a  或者 echo  ${a}------------区分$AB $A

set----------------------------显示所有的变量

env------------------------------显示所有的变量(只是显示所有的环境变量)

export m2=100等价于:m2=100export m2

只读变量:readonly  aa=200------这个只能访问,不能重心赋值,也不能清除,非只读变量可以清除

位置参量(命令行参数)

$0---------表示当前脚本名称

$1---------表示第一个位置参量

........

${10}----------------表示第十个位置参量

类似的有${11}....

$#---------------表示位置参量的总数

$*------------------以单个参数显示所有的位置参

----------------------------双引号内容表示一个参量

$!----------------------------最后一个进程在后台运行的进程号

$?----------------------------前一个命令的推出状态

$$-----------------------------echo $$显示当前进程的id

数组:

定义:arr=(enlish  china   compane)

引用:echo  ${arr[i]}

数组元素的个数: echo ${#arr[*]}

环境变量:

PATH=$PATH:/home/linux--------------------------/home/linux添加到环境变量,程序在执行的时候就是找到/home/linux去查找-------------只能对当前进程有用

第二章:重点掌握输入输出的概念以及操作原理,以及输出前景色和后景色

输入输出

注意:read把一行中的第一个单词赋值给var1,第二个单词赋值给var2.................把其他的单词赋值给最后一个变量

read var--------输入一行赋值给var变量

read –a arr------------------赋值一个数组(空格间隔)

read  -p input :” –t 10 –a  arr---------p”提示信息,-t超时返回

echo--------------输出

echo hell0

echo $a------------------输出变量a的值

echo ${a}b-------------在输出变量a后连接b字符

echo –n hello-------在字符串中不加\n

echo  -e  \t-----------\t交给echo来解析表四tab

echo输出颜色雨光标的定位:

\033[30m--\33[37m---------------设置前景色,即字体的颜色

\033[40m--\33[47m----------------设置背景色

\033[y;x--------------------------------设置光标位置

\033[0m------------------------------------------还原所有的设置

实例子:

echo –e \033[31tjjjgjjg------------------

echo -e "\033[44;37;5m ME \033[0m COOL"

以上命令设置作用如下:背景色为蓝色,前景色为白色,字体闪烁,输出字符ME,然后重新设置屏幕到缺省设置,输出字符me后颜色回复正常  www.2cto.com  

 

e是echo的一个可选项,它用于激活特殊字符的解析器。\033引导非常规字符序列。意味着设置属性然后结束非常规字符序列,这个例子里真正有效的字符是

44;37;5和0。修改44;37;5可以生成不同颜色的组合,数值和编码的前后顺序没有关系。

可以选择的编码如下所示:

  编码 颜色/动作

0 重新设置属性到缺省设置

1 设置粗体

2 设置一半亮度(模拟彩色显示器的颜色)

4 设置下划线(模拟彩色显示器的颜色)

5 设置闪烁

7 设置反向图象

22 设置一般密度

24 关闭下划线

25 关闭闪烁

27 关闭反向图象

30 设置黑色前景

31 设置红色前景

32 设置绿色前景

33 设置棕色前景

34 设置蓝色前景

35 设置紫色前景

36 设置青色前景

37 设置白色前景

38 在缺省的前景颜色上设置下划线

39 在缺省的前景颜色上关闭下划线

40 设置黑色背景

41 设置红色背景

42 设置绿色背景

43 设置棕色背景

44 设置蓝色背景

45 设置紫色背景

46 设置青色背景

47 设置白色背景

49 设置缺省黑色背景

 

第三章:重点掌握单引号和双引号的区别,反引号同$()使用,算术运算

单引号,双引号的区别

单引号----------------忽略所有的特殊字符

双引号-----------------忽略部分的特殊字符,但是不能忽略单引号还有$.....

反引号------------------波浪建,命令替换----------------也可以用$()命令替换

下面4,5两行不能用flist=$(ls $1)或者flist=`ls $1:`

  4 cd $1

  5 flist=$(ls)

  6 for i in ${flist}

  7 

  8         do

  9         if [ -f $i ] ; then

 10                 echo "$i is a file"

 11         elif [ -d $i ] ;then

 12                 echo "$i is a dirctory"

 13         fi

 14         done

                

Basename-------------求路径里最后一个的名称

Basename `pwd`

Dirname----------------dirname `pwd`

多层的反引号需要用转义字符“\

算术运算符(跟c语言是一模一样的):

算术的扩展:$[]

用法一:

N=10

        $[$N+1] 等于11

用法二:a=11

        b=$[$a+1]-------------------------可以将其赋值给b,这是完全正确的

b=$[$a*10]-------------------------这也是正确的

$(())----$[]等价

 (())-----------------((n+=1))--------------这个不能作为表达式

   T=((n+1))-------------------错误

expr 1 + 2-----------------可以,也可以作为左值将其赋值给变量

echo `expr 1 \* 10`

R =Exp 4 \* 5 -----------------20赋值给R,这是可以的

Let n=n+1----------------------可以通过这个算式来改变n的值

第四章:本章重点掌握条件测试的一些构成命令,以及格式

备注:空格这里非常重要,少了可能就是语法错误------------多用双引号

条件测试

命令成功或失败,表达式为真或假-------真用0,假用非0

test---------------shell内置命令

test $x gt $y------------------判断x是否大于y--------[  $x gt  $y  ]-------这种一定要有空格

参数:-eq--------------相等

-nq-------------------------------不等

-ge-------------------------------大于等于

-lt---------------------------------小于

-le-----------------------------------小于等于

Name=tom

[[  $name = [tT]?? ]]----------------------支持通配符的匹配

[  -z $str ]---------------------------------测试一个字符串是否为空,空为真(0

[  -n  $str ]--------------------------------测试一个字符串为非空串,非空为真(0

[ $str1 = $str2 ]-------------------------测试两个字符串是否相等,相等为真(0

[  $x –eq 1 ] ----------------------------测试是否相等,等为真(0

let $x == 1--------测试是否相等,等为真(0

let和双圆括号可以使用“== >= <= !=”等这些算术操作符,而中括号是不可以的

逻辑测试:

-a  

-o  

!  非

例子:

X=1name=tom

[  $x  -eq 1 –a –n $name ]---两个表达式相与

检测字符串为空串:

[  $name” “”]

[  ! $name” ]

[  x${name}” x” ]

-----------------------空返回真(0

文件测试:

[  -f  a  ]----------------检测文件是否存在,存在返回为真(0

-d-----目录

-f------普通文件

-L----链接文件--------------------不能测试同一目录下的链接文件

-s---------文件是否为空

第五章:重点掌握if语句,while语句,case语句,for语句,shell脚本通过这些命令来逻辑组织命令,同时在使用这些语句是通常会和常用的位置参量相联系,这也要熟练掌握

If语句:

语法结构:

If  expr1

Then

Elif expr2

.....

Else

Command

Fi

Case分支语句:

Case expr in

Pattern1

Command

;;

Pattern2

Command

;;

......

*

Command

;;

esac

pattern可以含有通配符

第六章:掌握循环语句for while以及相关的位置参量

循环语句:

For variable in list

Do

Command

Done

Eg:

For i in 1 2 3 4 5

Do

Echo $i

Done

位置参量使用:

For i in $*-----------------------------------------$@是相同效果

For i in  $*----------------------------------参数列表按照一个参数处理

For i in $@------双引号对其不起作用

For i in $@------------------------------------参数列表由空格间隔

For f in *------------------统计当前目录的文件个数

备注:$@$*只有在加“”时才有区别

For的另外一种方式:

For((e1;e2:e3))

do

command

done

while循环表达式:

while epr

do

command

done

until expr--------------------条件为假(非0)执行循环

do

command

done

break [n]---------------跳出n重循环

continue [n]---------------t跳出n次循环

select循环与菜单:

select varible in list

do

command

done

PS3=FAVERATOR PET------友好的提示信息

第七章重点掌握函数定义,使用,参数传递同c的不同,以及字符串的操作

函数:

Shell也支持函数

一般格式:

方式一:

Function function_name{

command

}\\

方式二:

Funciont_name(){}

Eg

Fun(){

Echo to here

Echo welcome baby

Echo  $#   $1  $2

}

Fun  1  2------------------------------------------调用函数,这里可以传递参数

字符串的操作:

${#var}-----------------字符串的长度

${var:3}---------------从下表为3的字符开始

${var:3:2}--------------------从下表为3的字符开始的两个字符

${var #*/}---------------开始第一个

${var##*/}-----------------开始最后一个

${var%/*}-----------------最后第一个

${var%%/*}----------------最后最后一个

Echo %RANDOM-----------------------打印即可生产随机数

通用的计算命令:

expr  5 % 3

shift命令--------------------

eval命令

eval将后面的参数连接成一条命令来执行,其执行的命令可以是动态的

trap命令--------------------------捕获信号

信号使得程序具有异步处理的能力,trap命令可以对信号的操作进行关联

sleep 10---------------睡眠十秒

第八章:了解sedawk命令(据说很强大,但是我没深入研究)

Sed流式编辑器:

Sed s/pub/PUB/’ test---------------test文件中的pub替换为PUB

Sed  3qtest------------------输出前三行

Sed 4,$dtest-------------------删除4行至最后一行

分号用来连接多个命令

awk命令

第一行:#!/bin/bash

type  ls-------------查看是否是内部命令

 

下面的一点区别是参考网上:http://www.2cto.com/os/201211/169809.html在下万分感谢

注意:

shell$*$@的区别

关于$* 和 $@的 一点 认识 同是菜鸟一起学习

$*
所有的位置参数,被作为一个单词.
注意:"$*"必须被""引用.
$@
$*同义,但是每个参数都是一个独立的""引用字串,这就意味着参数被完整地传递,
并没有被解释和扩展.这也意味着,每个参数列表中的每个参数都被当成一个独立的
单词.
注意:"$@"必须被引用.

$@ $* 只在被双引号包起来的时候才会有差异
双引号括起来的情况:
$*将所有的参数认为是一个字段
$@IFS(默认为空格)来划分字段,如果空格在“”里面,不划分。采用LS的脚本运行./test 1 "2 3" 4   来发现差异

没有括起来的情况是$@$*一样的,见到IFS就划分字段。还是采用LS的脚本运行./test 1 "2 3" 4   来发现差异