天道酬勤,恒者能胜。追求卓越,成功就会在不经意间追上你。

Shell编程基础概念之SHELL编程语法(七.1)

上一篇 / 下一篇  2012-12-31 11:12:31 / 精华(1) / 置顶(1) / 个人分类:Linux操作系统

我朋友的女儿四岁,叫姚惜,以前没觉得什么。昨晚带这小不点去逛商场
她在前面乱跑。我就叫她:姚惜,姚惜
谁知道这孩子回头对我怒气冲冲说了一句:八嘎... 我笑抽了



Script是以行为单位,我们所写的Script会被分解成一行一行来执行。而每一行可以是命令、注解、或是流程控制指令等。如果某一行尚未完成,在行末加上"\",这个时候下一行的内容就会接到这一行的後面,成为同一行。

 

Script中出现"#"时,再它後面的同一行文字即为注解,Shell会对其翻译。 在Script中要执行一个命令的方法和在命令列中一样,你可以前台或后台执行,执行命令时也会需要设定一些环境变量

 

Script的流程控制和一般高级语言的流程控制没有什麽两样,也和高级语言一样有副程式。这些使得Script的功能更加强大。

 

1 SHELL基本术语与关键字

.             当前shell程序相同目录

..            当前shell程序的上一级目录

break         退出forwhileuntilcase语句

cd                改变到当前目录

continue      执行循环的下一步

echo          反馈信息到标准输出

eval              读取参数,执行结果命令

exec          执行命令,但不在当前shell

exit          退出当前shell

export        导出变量,使当前shell可利用它

pwd           显示当前目录

read          从标准输入读取一行文本

readonly      使变量只读

return        退出函数并带有返回值

set               控制各种参数到标准输出的显示

shift             命令行参数向左偏移一个

test          评估条件表达式

times         显示shell运行过程的用户和系统时间

trap          当捕获信号时运行指定命令

ulimit        显示或设置shell资源

umask         显示或设置缺省文件创建模式

unset         shell内存中删除变量或函数

wait          等待直到子进程运行完毕,报告终止

 

2变量

Shell的类型只有字串变量,所以要使用数值运算则必须靠外部命令达成目的。而其变量种类有下列几种:

2.1普通变量

这是最常使用的变量,我们可以任何不包含空白字元的字串来当做变量名称。设定变量值时则用下列方式:

var=string  #不能是var = string,即等号两边不能有空格。与判断语句正好相反,判断语句表的=或者其他符号两边必须有空格,否则为赋值运算

取用变量时则在变量名称前加上一"$"号,或者${name}

name=Tom

echo name

echo $name

结果如下:

name

Tom

 

2.2环境变量

和使普通变量相似,只不过此种变量会将其值传给其所执行的命令。要将一使用者变量设定为系统变量,只要加上:

export var或者export var=var_value或者setenv var var_valued

name=Tom

export name

 

以下是使用者一进入系统之後就已设定好的系统变量:

$HOME使用者自己的目录

$PATH执行命令时所搜寻的目录

$TZ时区

$MAILCHECK每隔多少秒检查是否有新的信件

$PS1在命令列时的提示号

$PS2当命令尚未打完时,Shell要求再输入时的提示号

$MANPATH man指令的搜寻路径

 

2.3只读的使用者变量

和使用者变量相似,只不过这些变量不能被改变。要将变量设成只读的,只要加上:

readonly var

 

而若只打readonly则会列出所有只读的变量(ksh支持readonly命令。csh不支持,但是在shell程序中可以使用readonly修饰某个变量)。还有一点,系统变量不可以设定成只读的。

name=Tom

readonly name

echo $name

name=John

echo $name

(假设文件保存为aa)

结果如下:

aaa

aa[4]: name: This variable is read only

 

2.4特殊变量

有些变量是一开始执行Script时就会设定,并且不以加以修改,但我们不叫它只读的系统变量,而叫它特殊变量,因为这些变量是一执行程式时就有了,况且使用者无法将一般的系统变量设定成只读的。以下是一些等殊变量:

$0这个程式的执行名字

$n这个程式的第n个参数值,n=1..9

$*这个程式的所有参数

$#这个程式的参数个数

$$这个程式的PID

$!执行上一个背景指令的PID

$?执行上一个指令的返回值

 

$nn只能为0-9的原因,是Bourne Shell的位置参数变量为$1~$9,因此通过位置变量$n只能访问前9个参数。当你执行这个程式时的参数数目超过9时,我们可以使用shift命令将参数往前移一格,如此即可使用第10个以後的参数。除此之外,可以用set命令改变$n$*,方法如下:

set string

 

如此$*的值即为string,而分解後则会放入$n。如果set命令後面没有参数, 则会列出所有已经设定的变量以及其值。

echo Filename: $0

echo Arguments: $*

echo No. of args.: $#

echo 2nd arg.: $2

shift

echo No. of args.: $#

echo 2nd arg.: $2

set hello, everyone

echo Arguments: $*

echo 2nd arg.: $2

 

结果如下:

Filename: ex1

Arguments: this is a test

No. of args.: 4

2nd arg.: is

No. of args.: 3

2nd arg.: a

Arguments: hello, everyone

2nd arg.: everyone

 

2.5数组变量 (ksh支持)

name[index]=value

其中name为数组名称,index为数组下标,在ksh中数组最大支持1024,index0~1023.

或者

setA name value1 value2valuen

引用数组变量

${name[index]}

应用所有项:

${name[*]}   #或者

${name[@]}

 

如:

setA ser pps ppip mvpn

echo ${ser[2]}

echo ${ser[*]}

打印为:

mvpn

pps ppip mvpn

 

如:

setA ser pps ppip mvpn

echo $ser[2]

echo $ser[*]

打印为:

pps[2]

pps[*]

 

2.6 SHELL变量

SHELL程序中可以直接使用一些变量。常用有:

SECONDS        #ftp程序中判断超时经常使用这个变量

IFS            #域分割符,缺省为空格或者TAB键,可以由用户指定

 

3引用

某些字符在SHELL中具备特殊的含义:

如:& * + ^ $ ` " | ? [ ] ; ^ < >

可以使用双引号或者单引号或者\去掉特殊字符的含义,使成为一个普通字符.

3.1 ””可以去掉除$, \, ``之外的所有特殊字符的含义。

比如:

>echo *       #输出当前某个的所有目录与文件

>echo*      #输出*字符

>echo`date` #输出为date命令打印的时间“Tue Sep 17 11:31:58 MDT 2002

>echo$PATH  #输出当前用户的搜索路径

>echoa\na   #输出为2行,一行一个a,此时\为特殊字符

3.2 ‘’单引号可以去掉\去掉引号以内包含的任何特殊字符的含义,使成为一个普通字符.

比如:

>echo*       #输出*字符

>echo`date`  #输出`date`

>echo$PATH   #输出$PATH

>echoa\na    #输出为2行,一行一个a,此时\为特殊字符

 

3.3 \可以去掉& * + ^ $ ` " | ?的特殊含义,\本身的特殊含义可以用\去掉,比如\\后面一个\就是普通字符

如:

>echo \*           #输出*

 

4标准输入与输出

TAG: 零测试 BASH bash Bash 引用 shell Shell 变量 操作系统

 

评分:0

我来说两句

Open Toolbar