linux shell
来源:互联网 发布:简历熟悉办公软件 编辑:程序博客网 时间:2024/05/07 17:37
1. 概述
Shell共有如下几类:
(1)Bourne Shell,简称 sh
是AT&T Bell实验室的 Steven Bourne为AT&T的Unix开发的,它是Unix的默认Shell,也是其它Shell的开发基础。Bourne Shell在编程方面相当优秀,但在处理与用户的交互方面不如其它几种Shell。
(2)C Shell,简称 csh
是加州伯克利大学的Bill Joy为BSD Unix开发的,与sh不同,它的语法与C语言很相似。它提供了Bourne Shell所不能处理的用户交互特征,如命令补全、命令别名、历史命令替换等。但是,C Shell与BourneShell并不兼容。
(3)Korn Shell,简称 ksh
是AT&T Bell实验室的David Korn开发的,它集合了C Shell和Bourne Shell的优点,并且与Bourne Shell向下完全兼容。Korn Shell的效率很高,其命令交互界面和编程交互界面都很好。
(4)Bourne Again Shell ,简称bash
是自由软件基金会(GNU)开发的一个Shell,它是Linux系统中一个默认的Shell。Bash不但与Bourne Shell兼容,还继承了C Shell、Korn Shell等优点。
Shell程序可以存放在文件中,这种被Shell解释执行的命令文件称为Shell脚本(Shell Script)。Shell脚本可以包含任意从键盘键入的Linux命令。
脚本的执行方式共有三种,
(1) bash < filename
输入重定向方式。
(2) bash 脚本名 参数 或 . 脚本名 参数
例如: bash test /usr/meng
这种方式比第一种灵活
(3) 将shell脚本设置为可执行文件,然后执行他
这种方式最灵活,可以将需经常使用的命令编写成文件使用之。
2.Shell中变量。
变量分为临时变量和环境变量。临时变量在脚本执行结束后,就不复存在。变量不需要事先定义,可以在使用时才定义。
变量的定义方式: 变量名=变量值
注意: 等号两边不能有空格,否者不能执行。如果变量值中包含空格,则要用“”把变量括起来。
例如:
myfile=/usr/meng/ff/m1.c
可以将一个命令的执行结果赋值给变量。有两种形式,一种是使用倒引号引用命令,其一般形式是: `命令表`。 例如:
$ dir=`pwd`
另一种形式是:$(命令表)。上面的命令行也可以改写为:
$ dir=$(pwd)
执行结果就是将当前目录保存到变量 dir 中。
数组
下标从0开始
(1)申明方式。三种方法:两种没有显式的申明,另外一种使用declare申明。例如:
没有显式申明语句:
$ city[0]=
$ city[1]=
$ city[2]=
$
用declare命令显式声明一个数组:
declare -a 数组名
(2)使用数组元素值:
$ echo ${city[0]}
一个数组的各个元素可以利用上述方式一个元素一个元素地赋值,也可以组合赋值。定义一个数组并为其赋初值的一般形式是:
第三种申明方式:
数组名=(值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的元素个数也是7。A[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},如果pattern与name值的末尾匹配,那么name的值中去掉匹配部分后的结果就是该表达式的值;否则,该表达式的值就是 name的值。在第一种格式中,去掉的部分是最少的匹配部分;而第二种格式中,去掉的部分是最多的匹配部分。
(8)表达式${#@}和${#*}的值分别是由$@和$*返回的参数的个数。
(9)表达式${#name[i]}的值是数组name第i个元素值的长度(字符个数)。
(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 ?匹配f1、fa、fb等,但不能匹配 f 、fabc、 f12等。
[ ] 其中有一个字符组,它匹配该字符组所限定的任何一个字符。该字符组可以由直接给出的字符组成,
也可以由表示限定范围的起始字符、终止字符及中间一个连字符(-)组成。例如,f[a-d]与f[abcd]作
用相同。
! 表示不在一对方括号中所列出的字符。例如,f[!1—9].c 表示以f打头,后面一个字符不是数字1至9
的.c文件名,它匹配fa.c、fb.c、fm.c等。
(2)模式表达式。意指对于表达式中出现的通配符,可以用模式表达式为其作进一步的限定。
*(模式表) 匹配给定模式表中“模式”的0次或多次出现,各模式之间以“|”分开。例如,file*(.c|.o)将匹配文件file、file.c、file.o、file.c.c、file.0.0、file.c.o、file.o.c等,但不匹配file.h或file.s等。
+(模式表) 匹配给定模式表中“模式”的1次或多次出现,各模式之间以“|”分开。例如,file+(.c | .o)匹配文件file.c、file.o、file.c.o、file.c.c等,但不匹配file。
?(模式表) 匹配模式表中任何一种“模式”的0次或1次出现,各模式之间以“|”分开。例如,file?(.c|.o)只匹配file、file.c和file.0,它不匹配多个模式或模式的重复出现,即不匹配file. c. c、file.c. 0等。
@(模式表) 仅匹配模式表中给定“模式”的一次出现,各模式之间以“|”分开。例如,file@(.c|.0)匹配file.c和file.0,但不匹配file、file.c.c、file.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的变量值及工作目录等。
- Linux Shell
- Linux Shell
- Linux Shell
- Linux Shell
- Linux Shell
- Linux Shell
- linux shell
- Linux Shell
- Linux Shell
- Linux Shell
- Linux Shell
- linux shell
- LINUX SHELL
- Linux Shell
- Linux Shell
- Linux shell
- linux shell
- Linux Shell
- WAR3 天地劫技能节选003
- WAR3 天地劫技能代码节选004
- WAR3 澄海 恶魔气息 技能分析
- 七个受用一生的心理寓言
- 关于系统托盘的几个好的链接
- linux shell
- 用一辈子去领悟的生活经典
- 粗糙集理论介绍
- 入门:从源码看toString方法输出奇怪字符串的原因
- 用一辈子去领悟的生活经典
- Fedora Core 8下kde4.1 离线安装笔记
- 女性如何理解男人的性需求? 男性的性表达
- MFC如何实现com接口
- 中文真伟大!竟然有只能看不能读的文章