文档库 最新最全的文档下载
当前位置:文档库 › bash

bash

执行shell程序文件有三种方法
(1)#chmod xfile(在/etc/profile中,加入exportPATH=${PATH}:~/yourpath,就可以在命令行下直接运行,像执行普通命令一样)
(2)#shfile
(3)#.file
(4)#sourcefile
在编写shell时,第一行一定要指明系统需要那种shell解释你的shell程序,如:#!/bin/bash,

#!/bin/csh,/bin/tcsh,还是#!/bin/pdksh.
2.shell中的变量
(1)常用系统变量
$#:保存程序命令行参数的数目
$?:保存前一个命令的返回码
$0:保存程序名
$*:以("$1$2...")的形式保存所有输入的命令行参数
$@:以("$1""$2"...)的形式保存所有输入的命令行参数
(2)定义变量
shell语言是非类型的解释型语言,不象用C /JAVA语言编程时需要事先声明变量.给一个变量赋值,实际上就是定义了变量.在linux支持的所有shell中,都可以用赋值符号(=)为变量赋值.
如:
abc=9(bash/pdksh不能在等号两侧留下空格)
setabc=9(tcsh/csh)
由于shell程序的变量是无类型的,所以用户可以使用同一个变量时而存放字符时而存放整数.
如:
name=abc(bash/pdksh)
setname=abc(tcsh)
在变量赋值之后,只需在变量前面加一个$去引用.
如:
echo$abc
(3)位置变量
当运行一个支持多个命令行参数的shell程序时,这些变量的值将分别存放在位置变量里.其中第一个参数存放在位置变量1,第二个参数存放在位置变量2,依次类推...,shell保留这些变量,不允许用户以令外的方式定义他们.同别的变量,用$符号引用他们.

3.shell中引号的使用方法
shell使用引号(单引号/双引号)和反斜线("\")用于向shell解释器屏蔽一些特殊字符.反引号(")对shell则有特殊意义.
如:
abc="howareyou"(bash/pdksh)
setabc="howareyou"(tcsh)
这个命令行把三个单词组成的字符串howareyou作为一个整体赋值给变量abc.

setabc1='$LOGNAME,howareyou!'(tcsh)
abc2="$LOGNAME,howareyou!"(bash/pdksh)
setabc2="$LOGNAME,howareyou!"(tcsh)
LOGNAME变量是保存当前用户名的shell变量,假设他的当前值是:wang.执行完两条命令后,abc1的内容是:$LOGNAME,howareyou!.而abc2的内容是;wang,howareyou!.象单引号一样,https://www.wendangku.net/doc/58599753.html,反斜线也能屏蔽所有特殊字符.但是他一次只能屏蔽一个字符.而不能屏蔽一组字符.反引号的功能不同于以上的三种符号.他不具有屏蔽特殊字符的功能.但是可以通过他将一个命令的运行结果传递给另外一个命令.
如:
contents=`ls`(bash/pdksh)
setcontents=`ls`(tcsh)
4.shell程序中的test命令
在bash/pdksh中,命令test用于计算一个条件表达式的值.他们经常在条件语句和循环语句中被用来判断某些条件是否满足.test命令的语法格式:
testexpression
或者
[expression]

在test命令中,可以使用很多shell的内部操作符.这些操作符介绍如下:
(1)字符串操作符用于计算字符串表达式
test命令|含义
----------------------------------

-------
Str1=str2|当str1与str2相同时,返回True
Str1!=str2|当str1与str2不同时,返回True
Str|当str不是空字符时,返回True
-nstr|当str的长度大于0时,返回True
-zstr|当str的长度是0时,返回True
-----------------------------------------
(2)整数操作符具有和字符操作符类似的功能.只是他们的操作是针对整数
test表达式|含义
---------------------------------------------
Int1-eqint2|当int1等于int2时,返回True
Int1-geint2|当int1大于/等于int2时,返回True
Int1-leint2|当int1小于/等于int2时,返回True
Int1-gtint2|当int1大于int2时,返回True
Int1-neint2|当int1不等于int2时,返回True
-----------------------------------------
(3)用于文件操作的操作符,他们能检查:文件是否存在,文件类型等
test表达式|含义
------------------------------------------------
-dfile|当file是一个目录时,返回True
-ffile|当file是一个普通文件时,返回True
-rfile|当file是一个刻读文件时,返回True
-sfile|当file文件长度大于0时,返回True
-wfile|当file是一个可写文件时,返回True
-xfile|当file是一个可执行文件时,返回True
------------------------------------------------
(4)shell的逻辑操作符用于修饰/连接包含整数,字符串,文件操作符的表达式
test表达式|含义
----------------------------------------------------------
!expr|当expr的值是False时,返回True
Expr1-aexpr2|当expr1,expr2值同为True时,返回True
Expr1-oexpr2|当expr1,expr2的值至少有一个为True时,返回True
-----------------------------------------------------------
注意:
tcshshell不使用test命令,但是tcsh中的表达式同样能承担相同的功能.tcsh支持的表达式于C中的表达式相同.通常使用在if和while命令中.
tcsh表达式|含义
-------------------------------------------------------
Int1<=int2|当int1小于/等于int2时,返回True
Int1>=int2|当int1大于/等于int2时,返回True
Int1Int1>int2|当int1大于int2时,返回True
Str1==str2|当str1与str2相同时,返回True
Str1!=str2|当str1与str2不同时,返回True
-rfile|当file是一个可读文件时,返回True
-wfile|当file是一个可写文件时,返回True
-xfile|当file是一个可执行文件时,返回True
-efile|当file存在时,返回True
-ofile|当file文件的所有者是当前用户时,返回True
-zfile|当file长度为0时,返回True
-ffile|当file是一个普通文件时,返回True
-dfile|当file是一个目录时,返回True
Exp1||exp2|当exp1和exp2的值至少一个为True时,返回True.


Bash中对变量的操作
1.用户定义的变量
用户定义的变量有字母数字及下划线组成,并且变量名的第一个字符不能为数字.与其它UNIX名字一样,变量名是大小写敏感的.对于变量,用户可按如下方式赋值:
name=value
在引用变量时,需在前面加$符号,用户也可以在变量间进行相互赋

值,如:(前面的$是命令提示符)

$JOHN=john
$NAME=$JOHN

$echoHello$NAME
Hellojohn

也可以用变量和其他字符组成新的字,这时可能需要把变量用{}括起,如:

$SAT=Satur
$echoTodayis${SAT}day
TodayisSaturday

对于未赋值的变量,Bash以空值对待,用户也可以用unset命令清除给变量赋的值.
Bash中还可以使用数组变量,其赋值有两种:

(1)name[index]=value
(2)name=(value1...valuen)此时下标从0开始

数组下标的范围没有任何限制,同时也不必使用连续的分量.

Bash中关于变量的内建命令有:

(1)declare和typeset.两者具有一样的功能.其选项有:
[-/ ]a设置/撤消变量的数组属性
[-/ ]i设置/撤消变量的整数属性
[-/ ]r设置/撤消变量的只读属性
[-/ ]x设繮/撤消变量的输出属性
-pvar显示变量属性
(2)export和local.
export把变量输出到环境中,用法为:
exportname
exportname=value

这里需要简单介绍一下export的作用:当Bashshell执行一个程序时,将首先为该程序建立一个新的执行环境,称为子shell,在BashShell中变量都是局部的,即它们只是在创建它们的子Shell中是有意义的,佻用export后,变量被设置为全局变量,这时可以被其它子Shell所识别

local标记变量为局部的(如只能被函数内部使用),用法为:
localname
localname=value
(3)readonly.
指定变量为只读,执行后,改变量不能被再次赋值,用法为:
readonlyname

2.位置变量或Shell参数
BashShell在解释用户命令时,将把命令行的第一个子作为命令,而其它字作为参数通过位置变量传递给程序.$1,...,$9分别代表第一,...,九个参数.其中1-9是真正的参数名,"$"符只是用来标识变量的替换.位置变量$0指命令对应的可执行名.其它的还有:
$#送给命令的参数个数
$@所有的参数,每个用双括号括起
$*所有的参数,用双括号括起
3.与Shell有关的变量
(1)Shell自身设置皀一些常用变量:
LINENO正在执行的命令在脚本中的行号
PWD用户当前目录的全名
OLDPWD最近一次执行cd之前,用户当前目录的全名
PPID父进程ID
$当前进程ID
RANDOM随机数(范围0-32767)
SECONDSBashShell的运行时间,单位是秒
REPLYselect和read命令使用,以后会讲到
OPTARG
ORTIND这两个变量由getopt命令设置
UID当前用户的UserID
_上一条命令使用的最后一个参数
(2)影响Shell行为的一些常用环境变量:
PATH命令搜索路径,以冒号为分隔符.注意与DOS下不同的是,
当前目录不在系统路径里
HOME用户home目录的路径名,是cd命令的默认参数
COLUMNS定义了命令编辑模式下可使用命令行的长度
EDITOR默认的行编辑器
VISUAL默认的可视编辑器
FCEDIT命令fc使用的编辑器
HISTFILE命令历史文件
HISTSIZE命令历史文件中最多可包含的命令条数
HISTFILESIZE命令历史文件中包含的最大行数
IFS定义SHELL使

用的分隔符
LOGNAME用户登录名
MAIL指向一个需要SHELL监视其修改时间的文件.当该文件修改后,
SHELL将发消息Youhavamail给用户
MAILCHECKSHELL检查MAIL文件的周期,单位是秒
MAILPATH功能与MAIL类似.但可以用一组文件,以冒号分隔,每个文件后
可跟一个问号和一条发向用户的消息
SHELLSHELL的路径名
TERM终端类型
TMOUTSHELL自动退出的时间,单位为秒,若设为0则禁止SHELL自动退出
PROMPT_COMMAND指定在主命令提示符前应执行的命令
PS1主命令提示符
PS2二级命令提示符,命令执行过程中要求输入数据时用
PS3select的命令提示符
PS4调试命令提示符
MANPATH寻找手册页的路径,以冒号分隔
LD_LIBRARY_PATH寻找库的路径,以冒号分隔


2.条件变量替换:
BashShell可以进行变量的条件替换,既只有某种条件发生时才进行替换,替换条件放在{}中.
(1)${value:-word}
当变量未定义或者值为空时,返回值为word的内容,否则返回变量的值.
(2)${value:=word}
与前者类似,只是若变量未定义或者值为空时,在返回word的值的同时将word赋值给value
(3)${value:?message}

若变量以赋值的话,正常替换.否则将消息message送到标准错误输出(若此替换出现在Shell程序中,那么该程序将终止运行)
(4)${value: word} 若变量以赋值的话,其值才用word替换,否则不进行任何替换
(5)${value:offset}
${value:offset:length} 从变量中提取子串,这里offset和length可以是算术表达式.
(6)${#value} 变量的字符个数
(7)${value#pattern}
${value##pattern} 去掉value中与pattern相匹配的部分,条件是value的开头与pattern相匹配
#与##的区别在于一个是最短匹配模式,一个是最长匹配模式.
(8)${valuepattern}
${valuepattern}
于(7)类似,只是是从value的尾部于pattern相匹配,与的区别与#与##一样
(9)${value/pattern/string}
${value//pattern/string}
进行变量内容的替换,把与pattern匹配的部分替换为string的内容,/与//的区别与上同
注意:上述条件变量替换中,除(2)外,其余均不影响变量本身的值

2.变量的算术运算
在BashShell中,只能进行两个整数间的运算,其结果仍为整数.要进行算术运算,需要使用let命令,语法为:
letexpr
expr是一个包含项和操作符的表达式,项可以是一个变量或是一个整数常数,当使用整数常数时,其默认为十进制整数,用户可以用radio#number来指定其它形式的整数,其中radio定义了整数是几进制表示的,number是该整数的值.若radio>10,那么数字字符可从0-9和A-Z.
在表达式中支持的操作符及其含义为:
,-,*,/,加,减,乘,除,取模
>>,<<,&,^,|左移,右移,位与,位异或,位或
?:三元运算符.与C语言中的定义一致
~取补码
!,>=,<=,>,<,==,!=,&&,||
=, =,-=,*=,/=,=,<<=,>>=,&=,^=,|=
表达式式中也可以使用括号.括号或运算优先级的定义与一般计

算机语言中的相同.
let命令具有返回值.当计算结果(若有多个表达式时,以最后一个为准)为0时,返回值为1,否则为0.
当表达式中含有shell的特殊字符(如|)时,需要用引用符('或")将其引用起来.使用let时还需要注意的时,对于letx y这样的式子,shell虽然计算了x y的值但却将结果丢弃,若不想这样,可以使用letsum=x y将x y的结果保存在变量sum中另外还可以使用((和))操作符取代let命令,而且这样的话,还可以省去对算术表达式的引用,如果想返回表达式的值,则需用$(())的格式.




相关文档