计算机等级考试三级linux Shell复习
1.shell本身是一个用c语言编写的程序,是连接用户 和 UNIX/Linux内核的桥梁,用户的大部分工作是通过shell完成的。
2.脚本的第一行“#! /bin/bash”的作用是 决定了shell 将到哪些目录中寻找命令或可执行程序,当用户运行一个命令或可执行程序时,一定会在这些目录下,按顺序依次搜寻。
3.环境变量PACH的作用是 :决定了shell将到哪些目录中寻找命令或可执行程序;当用户执行一个名灵活可执行程序时,linux在这些目录下依次搜寻。
4.后台进程在运行过程中与用户无交互,无交互指的是 不响应用户的输入和中断信号,在后台运行的命令一样会将结果输出到屏幕上。
5.命令别名设置命令:alias
格式:alias ll ='ls -l'
输入别名后,bash寻找它维护的别名表,若找到,该命令就被定义的内容替换。
6.脚本的运行方法:
A. 增加可执行权限,绝对路径+文件名执行。可以带参数。
B. 脚本名作为参数传递给shell程序执行,可以带参数。
C. 将脚本以输入重定向的方式传给bash。bash< sh01,不能带参数。
6.通配符
* 任意字符0到多个;
? 任意字符1个;
[ ] 括号中的字符(限定范围)任意1个,用逗号隔开,也可以是0-9,a-z等范围;
[^ ] 或[! ] 括号中的字符之外的字任意符1个;
{str1,str2,…}匹配括号中指定的1个字符串。逐个全部匹配,如ls /{etc,dev,opt} 等同同时加三个参数。
7.引号
A.单引号:引用一串字符,解释为普通字符串;
B.双引号:引用一串字符,保留$、`也就是倒引号、\转义符的意义,其他解释为普通字符;如要在双引号中输出$和倒引号,需要用转义符转义;
C. 倒引号`
范围内的字符串解释为命令行。shell将先执行范围内的命令,用执行结果替换整个倒引号部分。
D. 转义字符\
引用单个字符,称为转义了这个字符。
8.输入、输出重定向字符
输入重定向:
command < file 文件作为命令输入;
command << 分界符 从标准输入中读入直到遇到分界符停止;
输出重定向:
cmd 2>file 错误信息输出到文件,覆盖方式;
cmd 2>>file 追加当时输出错误信息到文件;
完整格式是 fd>file,fd表示文件描述符。在每个进程中,为了表示和区分已经打开的文件,linux会给每个文件分配一个ID,是一个整数,成为文件描述符(file Descriptor)。进程创建的时候,系统为每个进程自动打开3个标准文件:标准输入stdin、标准输出stdout、错误输出stderr。其文件描述符分别是0、1、2。文件描述符为1时为默认值,可以忽略不写。如果正确信息和错误信息都输出到一个文件,要写为 2>& 1 样式,注意,fd、>、&时间不能有空格;
特殊情况:/dev/null 设备是系统垃圾箱,放入其中的数据将被丢弃。
9.命令执行操作符:
A.顺序执行:用“;”号连接的多条命令将会依次执行,命令之间没有逻辑关系。
B.逻辑与:使用“&&”连接的多条命令,只有第一条命令正确执行了,第二条命令才会执行。
C.逻辑或:使用||连接多条命令,前一条命令执行错误,第二条命令才执行。
优先级:逻辑与和逻辑或优先级相同。
判断依据:命令执行后,会有一个$?变量,返回值为0,执行正确,非0则执行错误。
10.小括号和大括号:都可以奖若干名伶组合在一起,逻辑上被视为一条命令;
大括号{}使用时,左括号后必须有空格,右括号前必须用分号“;”或者换行符终止,括号中的命令可以换行,每个命令独占一行。运行时是在当前shell中。
小括号()使用时,命令之间用分号“;”隔开,运行时开启一个子shell运行。
10.管道符、后台命令符、注释符
管道符用竖线“|”符号,用来连接多条命令,每条命令都有一个独立的进程,前一个命令的输出是下一个命令的输入。
后台命令符“&”,命令后加上后台命令符后,命令进入后台模式,在运行过程中,与用户无交互,不想赢用户的输入和终端控制信号。
注释符“#”,以井号开头的正文行表示单行注释,shell会自动忽略不执行。
脚本开头的#!后边跟的是解释该脚本的shell的绝对路径,表示首先按绝对路径找到shell程序,启动shell程序解释脚本。
11.变量
A.命名:字母或下划线开头,字母、数字、下划线组成。用户定义变量一般用小写字母,大写字母变量一般是系统默认变量;
B.声明:shell所有变量类型默认字符串型,可不必声明。也可以用命令声明为其他类型。
declare命令,DECLARE,选项如下:
- 给变量设定类型属性
+取消变量的类型属性
-a声明为数组型
-i声明为整数型(Integer)
-r声明为只读变量。一旦设定了只读属性,既不能修改值,也不能删除变量,甚至不能用+号取消只读属性,只有结束该shell,重新登陆或重启,这个变量才会消失。
-x声明为环境变量;edclare -x 变量名的用法等同于export 变量名。
-p显示变量被声明的类型。
数组声明:定义数组的形式:array 变量名=(变量1 变量2 … 变量n),数组元素用空格分隔。下标可以不连续,下标的范围也没有限制。也可以用declare -a name 的形式声明数组。
C.赋值:用等号“=”赋值,两边不能有空格。如字符串包含空格,需要加引号。
数组赋值时可以一起赋值,也可指定下标单独赋值,如array name[0]=value。
D.引用:变量引用时,在变量名前加上美元符号“$”,变量名和后面的字符需要区分时,把变量名放到大括号“{}”中界定,或者把美元符号和变量名一起放到双引号中。
美元符号加小括号$()等价于倒引号,作用是把括号内命令的执行结果赋值给变量。
E.变量查询:
命令1:set 变量名。拼写SET,查询所有局部变量和全部变量;
命令2:env,拼写为ENV,查询所有环境变量,包括本进程及祖先进程全局(环境)变量;
命令3:export,拼写为EXPORT,显示本进程利用export定义的全部变量(全局变量);
三者用法基本相同,输入命令不带参数。
F.变量删除:unset 变量名,拼写UNSET,用法为命令加变量名,环境变量和自定义变量用法相同。
数组引用:格式为美元符号大括号数组名中括号变量名下标,${name[2]};
如果下标为星号*,则读取整个数组,将整个数组扩展为一个字符串,字符串内容为空格分开的各个数组元素;
如果下标为at符号@,则读取整个数组,将数组扩展为多个字符串;
如果不给出下标,或者类似普通标量一样引用,则默认下标为0,即$name==${name[0]}
12.系统预定义变量(也就是环境变量,环境变量是全局变量,在当前shell及其子shell中生效,修改时进修该内存中的变量值,没有修改配置文件,shell终止变量的修改就失效;用户定义变量是局部变量,仅在当前shell中生效):
声明:用export或者declare -x定义环境变量,,命令拼写EXPORT。export命令将变量送入进程转出区,进程转出区的变量将被子进程继承。命令格式为export 变量名,此用法等同于declare -x 变量名。
赋值:和用户自定义变量相同,但是不修改配置文件。
查询:列出已经定义的所有环境变量,可以用env命令,拼写EVN。
主要环境变量有以下:
HOME:家目录绝对路径;可以通过cd ~、cd $HOME、cd不带参数进入家目录;
PATH:shell查找命令的目录列表,包含带冒号分界符的字符串;通常,用户会在家目录下建一个bin目录,存放自己编写的命令,把这个路径加入PATH中,用户执行自定义命令时就可以不加路径,像系统命令一样使用,加入方法:PATH=$PATH:$HOME/bin,注意事项,用户自定义命令路径要放在最后,因为系统寻找时会根据路径先后顺序寻找。
PS1:拼写,字母PS加数字1,是shell的主提示符,它定义主提示符的构成,默认是用户名@主机名、工作目录、美元符号。常用转义字符及其含义如下:
\$:美元符号,为提示字符,root用户显示#号,普通用户显示$美元符号;
\t:小写字母t,显示时间,24小时格式,HH:MM:SS;
\T:大写字母T,显示时间,12小时格式;
\h:显示完整主机名;
\s:小写字母s,所用shell名称;
\v:小写字母v,bash的版本号。
PWD:当前工作目录的绝对路径。
SHELL:当前使用的shell,指出解释程序放在什么地方;
$? :美元符号加问号,上一条命令执行后的返回值(又叫返回码,退出状态等),十进制数,执行成功为0,执行失败为非0.
$$:当前进程的进程号(PID)
$!:上一个后台命令的进程号(PID)
$-:当前命令选项。用set命令可以更改运行时的选项设定。
$#:命令行上参数的个数。
$n:美元符号加整数,整数为0代表命令本身,大于0代表对应的参数,大于9时需要用大括号。
$*、$@:美元符号加星号,代表命令号所有参数,视为一个整体;美元符号加AT符号,代表命令行所有参数,每个参数区别对待。
13.数值运算:默认变量都是字符串型,需要运算时,可以用declare声明为整数型,或者使用以下命令:
A.expr命令:拼写EXPR,用法:a=$(expr $b + $c),加号两侧必须有空格。
B.let命令:拼写LET,用法为 let a=$b+$c ,let n+=1 ,符号之间不能有空格;实测 let c=a+b也可以使用。
C.使用$((算术表达式))运算:美元符号加双小括号内的算术表达式,只能包含一个算数表达式。
14.条件测试语句
A.test命令,拼写TEST,用法test加测试运算符加测试语句,可以用方括号代替test命令,也就是把测试预算符合测试语句放到方括号中,方括号内两端有空格。如 test -f file 等同于[ -f file ]。
B.用双小括号包含测试语句,如((m<=n))。
C.常用文件测试运算符,格式为运算符加文件名。
-r :字符r,文件存在且可读;
-w:字符w,文件存在且可写;
-x:字符x,文件存在且用户可执行;
-f:字符f,文件存在且为普通文件;
-d:字符d,文件存在且是目录;
-L:字符大写L,文件存在且是符号链接;
-b:字符b,文件存在且是块设备文件;
-c:字符c,文件存在且是字符设备文件;
-s:字符s,文件存在且长度大于0;
-e:字符e,文件是否存在。
以下运算符格式为两个文件名中间放运算符,比较两个文件:
-nt,左边文件是否比右边文件新;
-ot,左边文件是否比右边文件旧;
D.字符串测试运算符:
-z:字符z,字符串长度为0,返回真;
-n:字符n,字符串长度大于0,返回真;
=、!=:等于符号,等号两边字符串是否相等,注意等号两边要有空格;感叹号加等号,两边字符串是否不相等。
E.数值测算运算符:放于两个数字中间。
-eq:等于;-ne:不等于;-lt:小于;-le:小于等于;-gt:大于;-ge:大于等于。
E.测试运算语句可以逻辑与(&&符号)和逻辑或(||符号)连接。
15.控制结构
A.if分支:if [测试条件];then 命令1;else 命令2;fi,中间语句用分号隔开,结束符不用分号。如果写成多行,则每条语句占一行,不用分号,如下:
if 逻辑表达式
then 命令1
exit 1 #注释:exit后面的值赋给变量$?,exit后的所有语句不再执行
elif 逻辑表达式
else 命令2
fi
B.多分支
case 变量 in
“值1”) 命令1
命令n;; # 注释双引号结束。
"值2") 命令1
命令2;; # 双引号结束。
*) 命令1 # 星号可以缺省。
命令n;;
esac #case反过来写。
C.select循环,拼写SELECT
格式:
select 加新变量名 加 in空格隔开的值。此处与for in相似。
do
语句
done
运行时输入in后面各个值的序号,该循环为死循环,ctrl加D退出,通常和case连用。
连用举例:
echo “Where are you?”
select name in "beijing" "shanghai" "nanjing"
do
case $name in
"beijing")
echo " you are in Beijing."
break;;
"shanghai")
echo "you are in shanghai."
break;;
"nanjing")
echo "you are in nanjing."
break;;
*)
echo " I do nont know!"
easc
done
D.while循环
while 判断条件
do
语句
done
E.until循环
until 判断条件
do
语句
done
F.for循环
第一种
for ((exp1;exp2;exp3))
do
语句
done
第一次运行依次执行3个exp,循环中依次执行exp2、exp3。
第二种
for n in value list(空格隔开的值)
do
语句
done
第三种,缺省valuelist
for str (空格隔开的值)
do
语句
done
G.break和continue,拼写BREAK、CONTINUE
break n n表示跳出循环的层数,省略n跳出整个循环;
continue n 表示循环的层数,缺省仅对当前循环有效。
14.函数FUNCTION
function name(){
语句
[return value]
}
name是函数名,return value是返回值;
可以省略function,如果不省略function,可以省略函数名称后的小括号。
参数传递方法和普通命令一样。
15.系统函数
$RANDOM 产生0~32767之间的随机数。