linux shell

来源:互联网 发布:简历熟悉办公软件 编辑:程序博客网 时间:2024/05/07 17:37

1. 概述

 Shell共有如下几类:

(1)Bourne Shell,简称  sh

       AT&T Bell实验室的 Steven BourneAT&TUnix开发的,它是Unix的默认Shell,也是其它Shell的开发基础。Bourne Shell在编程方面相当优秀,但在处理与用户的交互方面不如其它几种Shell

(2)C Shell
,简称  csh

      是加州伯克利大学的Bill JoyBSD Unix开发的,与sh不同,它的语法与C语言很相似。它提供了Bourne Shell所不能处理的用户交互特征,如命令补全、命令别名、历史命令替换等。但是,C ShellBourneShell并不兼容。

(3)Korn Shell
,简称  ksh

      AT&T Bell实验室的David Korn开发的,它集合了C ShellBourne Shell的优点,并且与Bourne Shell向下完全兼容。Korn Shell的效率很高,其命令交互界面和编程交互界面都很好。

(4)Bourne Again Shell
,简称bash

      是自由软件基金会(GNU)开发的一个Shell,它是Linux系统中一个默认的ShellBash不但与Bourne Shell兼容,还继承了C ShellKorn Shell等优点。

 

      Shell程序可以存放在文件中,这种被Shell解释执行的命令文件称为Shell脚本(Shell Script)Shell脚本可以包含任意从键盘键入的Linux命令

 

      脚本的执行方式共有三种,

(1)  bash  < filename

      输入重定向方式。

(2) bash  脚本名  参数                     . 脚本名 参数

      例如:  bash test /usr/meng

      这种方式比第一种灵活

(3) shell脚本设置为可执行文件,然后执行他

      这种方式最灵活,可以将需经常使用的命令编写成文件使用之。

 

 2Shell中变量。

 

     变量分为临时变量和环境变量。临时变量在脚本执行结束后,就不复存在。变量不需要事先定义,可以在使用时才定义。

     变量的定义方式:       变量名=变量值

     注意: 等号两边不能有空格,否者不能执行。如果变量值中包含空格,则要用“”把变量括起来。

例如:

myfile=/usr/meng/ff/m1.c

     可以将一个命令的执行结果赋值给变量。有两种形式,一种是使用倒引号引用命令,其一般形式是: `命令表` 例如:

$ dir=`pwd`

另一种形式是:$(命令表)。上面的命令行也可以改写为:

$ dir=$(pwd)

     执行结果就是将当前目录保存到变量 dir 中。

 

数组

     下标从0开始

(1)申明方式。三种方法:两种没有显式的申明,另外一种使用declare申明。例如:

                                 没有显式申明语句:

$  city[0]=Beijing

$  city[1]=Shanghai

$  city[2]=Tianjin

$

                         declare命令显式声明一个数组:

declare  -a  数组名

(2)使用数组元素值:

$  echo  ${city[0]}

Beijing

一个数组的各个元素可以利用上述方式一个元素一个元素地赋值,也可以组合赋值。定义一个数组并为其赋初值的一般形式是:

                           第三种申明方式:

数组名=(1  2  ...  n)

其中,各个值之间以空格分开。

例如:

$  A=(this is an example of shell script)

$ echo  ${A[0]}  ${A[2]}  ${A[3]}  ${A[6]}

this an example script

$ echo  ${A[8]}

 

$

由于值表中初值共有7个,所以A的元素个数也是7A[8]超出了已赋值的数组A的范围,就认为它是一个新元素,由于预先没有赋值,所以它的值是空串。 当使用*@作数组下标,含义是调用数组的所有元素。

变量的使用方式:

除了上面所介绍的变量引用方式外,在bash中还有其它的引用方式。归纳起来,有效的变量引用表达式有以下形式:


$name               ${name#pattern}

${name}                    ${name##pattern}

${name[n]}          ${name % pattern}

${name[*]}          ${name %% pattern}

${name [@]}         ${#@}

${name:-word} ${$#*}

${name:=word} ${# name }

${name:?word} ${# name[*]}

${name:+word} ${#name[@]}

1)表达式$name表示变量name的值,若变量未定义,则用空值替换。

2)表达式${name}将被变量name的值替换。用花括号括起name,目的在于把变量名与后面的字符分隔开,避免出现混淆。替换后花括号被取消。

3${name[n]}表示数组变量name中第n个元素的值。

4)表达式${name[*]}${name[@]}都表示数组name中所有 非空元素的值,每个元素的值用空格分开。如果用双引号把它们都括起来,那么二者的含义就有区别:对于"${name[*]}",它被扩展成一个词(即字符 ),这个词由以空格分开的各个数组元素组成;对于"${name[@]}",它被扩展成多个词,每个数组元素是一个词。如果数组name中没有元素,则 ${name[@]}被扩展为空串。

5)表达式${name:-word}${name:=word}${name:+word}${name:?word}的计算方法在下面介绍。

6)表达式${name#pattern}${name##pattern} 如果pattern(表示匹配模式)name值的开头匹配,那么name的值去掉匹配部分后的结果就是该表达式的值;否则, name的值就是该表达式的值。在第一种格式中,name值去掉的部分是与pattern匹配的最少的部分;而第二种格式中,name值去掉的部分是与 pattern匹配的最多的部分。

7)表达式${name %pattern}${name %%pattern},如果patternname值的末尾匹配,那么name的值中去掉匹配部分后的结果就是该表达式的值;否则,该表达式的值就是 name的值。在第一种格式中,去掉的部分是最少的匹配部分;而第二种格式中,去掉的部分是最多的匹配部分。

8)表达式${#@}${#*}的值分别是由$@$*返回的参数的个数。

9)表达式${#name[i]}的值是数组namei个元素值的长度(字符个数)

10)表达式${#nane[*]}${#name[@]}的值都是数组name中已经设置的元素的个数。

交互输入变量值

利用read命令可以从键盘上读取数据,然后赋给指定的变量。read命令的一般格式是:

read  变量1 变量2 …

例如:

read  a  b  c

输入数据时,数据间以空格或制表符作为分隔符。如果变量个数与给定数据个数相同,则依次对应赋值;如果变量个数少于数据个数,则从左至右对应赋值,但最后一个变量被赋予剩余的所有数据;如果变量个数多于给定数据个数,则依次对应赋值,而没有数据与之对应的变量取空串。

系统预定义变量

Shell中,预先定义了几个有特殊含义的Shell变量,它们的值只能由Shell根据实际情况进行赋值,而不能通过用户重新设置。下面给出这些特殊变量的表示形式及意义:


$#     
命令行上实际参数的个数,但不包含Shell脚本名。
$
   上一条命令执行后的返回值(也称作退出码)。它是一个十进制数。多数Shell命令执行成功时,则返回值为0;如果执行失败,则返回非0值。

$$      
当前进程的进程号。

$
   上一个后台命令对应的进程号,这是一个由1~5位数字构成的数字串。

$-      
由当前Shell设置的执行标志名组成的字符串。例如:

set  xv

  这个命令行给Shell设置了标志-x-v(用于跟踪输出)。

$*     表示在命令行中实际给出的所有实参字符串,它并不仅限于9个实参。

$ @   它与$*基本功能相同,但“$@”“$*”不同。

环境变量

常用的环境变量如下:

HOME    用户主目录的全路径名。

LOGNAME    即注册名,由Linux自动设置。它是与系统交互的名字或字符串。

MAIL   系统信箱的路径。

PATH   查找命令的目录列表。PATH变量包含带冒号分界符的字符串,这些字符串指向含有所使用命令的目录。

PS1    Shell的主提示符。bash默认的主提示符一般为“/s-/v/$ ”。其中,/s表示Shell的名称;/v表示bash的版本号。当然,也可以随意设置PS1的值,例如:

PS1="Enter Command> "

则主提示符改成“Enter Command> ”

PWD    当前工作目录的路径,它指出目前在Linux文件系统中处在什么位置。

SHELL   当前使用的Shell,它也指出Shell解释程序放在什么地方。

TERM     终端类型。

可以使用unset命令删除一个环境变量(NAME)

$ unset NAME

可以创建一个新的环境变量,或者改变一个已有的环境变量的值,其形式与设置一般变量相同。如果变量值的字符串中带有空格等特殊字符,需要用引号把整个字符串括起来。利用export命令可以将这些变量导出,使它们成为公用量,如:

export  HOME  HZ  LOGNAME  TERM

可以利用env命令列出所有的环境变量,包括本进程及以前的祖先进程所导出的变量。

历史命令

       Linux会把用户输入的命令以表格的形式保存在文件~/.bash_history,可以利用这个文件完成很多功能。

history命令可以显示命令历史表中的命令。其语法格式是:

history [option][arg ?]

(1)   如果不带任何参数,显示所有的历史命令。

(2)   如果history 后给出一个正整数,则数字表示显示历史命令的最后多少行。

(3)   如果history后给出一个文件名,则把文件作为历史命令文件。

历史文件中能够保留的命令个数有限,其默认值是500。如果用户输入的命令太多,超过限定值,那么最早输入的命令就会从历史表中删除,而新输入的命令会加到该表尾部。用户可以利用HISTSIZE变量重新设定该值。例如:

$ HISTSIZE=600

别名

定义别名要使用Shell内部命令alias,其一般语法格式为:

alias name=value…

例如:

$ alias  ll=' ls -l '

定义了别名时,常用‘’将名字括起来。因为在=的两边不允许出现空格。取消先前定义的别名,可使用如下命令

unalias name…

 

SHELL的特殊字符

        Shell包含很多的通配符,而且这些通配符可以组合后用于模式表达式中。

(1)一般通配符

*      匹配任意字符0次或多次出现。例如,f*可以匹配以f 打头的任意字符串。但应注意,文件名前面的

       圆点( . ) 和路径名中的斜线( / )必须显式匹配。

  匹配任意一个字符,例如,f ?匹配f1fafb等,但不能匹配 f fabc f12等。

[ ]    
其中有一个字符组,它匹配该字符组所限定的任何一个字符。该字符组可以由直接给出的字符组成,

       也可以由表示限定范围的起始字符、终止字符及中间一个连字符(-)组成。例如,f[a-d]f[abcd]

       用相同。
!      
表示不在一对方括号中所列出的字符。例如,f[!1—9].c 表示以f打头,后面一个字符不是数字19

         .c文件名,它匹配fa.cfb.cfm.c等。

2)模式表达式。意指对于表达式中出现的通配符,可以用模式表达式为其作进一步的限定。

*(模式表)        匹配给定模式表中模式0次或多次出现,各模式之间以“|”分开。例如,file*(.c.o)将匹配文件filefile.cfile.ofile.c.cfile.0.0file.c.ofile.o.c等,但不匹配file.hfile.s等。

+(模式表)       匹配给定模式表中模式1次或多次出现,各模式之间以“|”分开。例如,file+(.c | .o)匹配文件file.cfile.ofile.c.ofile.c.c等,但不匹配file

?(模式表)       匹配模式表中任何一种模式0次或1次出现,各模式之间以“|”分开。例如,file?(.c.o)只匹配filefile.cfile.0,它不匹配多个模式或模式的重复出现,即不匹配file. c. cfile.c. 0等。

@(模式表)     仅匹配模式表中给定模式的一次出现,各模式之间以“|”分开。例如,file@(.c.0)匹配file.cfile.0,但不匹配filefile.c.cfile.c.o等。

!(模式表)        除给定模式表中的一个模式之外,它可以匹配其它任何东西。

引号

       引号分为三种。单引,双引及倒引。

1)单引号中的字符都解释为普通字符

2)双引号中的字符大都作为普通字符,除了一下几个:$, 倒引号(`,反斜杠(/)。仅当“/”后面的字符是下述字符之一时,“/”才是转义字符,这些字符是:“$”“`”“"”“/”或换行符。

3)倒引号括起来的字符串被shell解释为命令行,在执行时,Shell会先执行该命令行,并以它的标准输出结果取代整个倒引号部分。

$ echo  current  directory  is  ` pwd `

current  directory  is  /home/mengqc

Shell程序中以“#”开头的正文行表示注释。

在文件的第一行,一般以  #!/bin/bash 开始,表示下面的脚本是用bash编写的,必须调用bash程序对它解释执行。

命令执行操作符

(1) 多条命令可以在一行中出现。它们可以从左到右顺序执行。此时,各条命令之间应以分号( ;)隔开。

(2) 在相邻命令间可存在逻辑关系,即逻辑和逻辑

逻辑与操作符“&&”可把两个命令联系在一起,其一般形式:

命令1 && 命令2

其功能是先执行命令1,如果执行成功,才执行命令2;否则,若命令1执行不成功,则不执行命令2

逻辑或操作符“||”可把两个命令联系起来,其一般形式是:

命令1 || 命令2

其功能是先执行命令1,如果执行不成功,则执行命令2;否则,若命令1执行成功,则不执行命令2

(3)组合命令。Shell中有两种方式可以将若干命令组合在一起,使其在逻辑上被视为一条命令,它们是用花括号{}将各命令括起来和用圆括号( )括起来。被括在一起的命令,其中每个命令的结果被汇集起来作为整体,可作为其他命令的输入。

使用花括号时在格式上应注意:左括号 “{ ”后面应有一个空格;右括号“}”之前应有一个分号( ;)。但在用圆括号括起成组命令时,左括号后不必有空格,右括号之前也不需加上分号。这两种括号的效果有区别:用花括号括起来的成组命令只是在本Shell内执行命令表,不产生新的进程;而用圆括号括起来的成组命令是在新的子Shell内执行,要建立新的子进程。因此,在圆括号内的命令不会改变父Shell的变量值及工作目录等。

 

 
原创粉丝点击