启动B-shell
启动一个交互式B-shell
- 键入
sh
命令,即进入了B-shell
#/bin/sh:脚本文件的执行
- shell脚本是预先定义好的一个命令序列,由需要执行的命令构成的文本文件
- 系统规定,如果脚本文件的第一行的头两个字符是
#!
,那么,就用这行后面的说明启动一个命令来解释这个脚本文件中的文本
重定向和管道
输入重定向
输入重定向自文件
- 用法:
<文件
- 将标准输入重定向到一个磁盘文件,而不是从键盘输入
Here Document
- 用法:
<<定界符
- 从shell脚本中获取数据,直到再次遇到定界符为止
- 简单的Here Document:
- 在Here Document中进行命令替换和变量替换
输出重定向
标准输出重定向
- 用法:
>文件
>>文件
- 将标准输出重定向到一个磁盘文件
- 例如:
ls -l > file1
:将命令ls标准输出定向到文件file1中,若文件已存在,就覆盖它 - 例如:
ls -l >> file1
:将命令ls标准输出定向到文件file1中,若文件已存在,就追加到文件尾部
标准错误输出重定向
- 用法:
2>文件
- 将标准错误输出重定向到文件
指定文件描述符的输出重定向
- 用法:
文件描述符>&文件描述符
变量
变量赋值和引用
-
shell变量只有一种类型,
存储字符串
-
变量名的第一个字符
必须为字母
,其余字符可以是字母,数字,下划线 -
变量不需要事先定义,直接赋值就可以定义一个新变量,或者修改原变量的值
-
引用时,在变量名前加
$
符,代表变量的内容 -
举例:
-
在等号两侧不允许有多余的空格
-
echo
命令:输出命令,打印变量值,用户提示 -
引用时,在变量名前加
$
符,代表变量的内容 -
赋值时,等号右侧的字符串中含有空格或者制表符,换行符时,要用引号将打算赋值的字符串括起来
-
引用一个未定义的变量,变量值为空字符串
read:读用户的输入
- 内部命令
read
,可以从标准输入上读入一行,并将这行的内容赋值给一个变量
环境变量和局部变量
- 所创建的shell变量,默认为局部变量
- 使用shell内部命令
export
可以将一个局部变量转换为环境变量 - 在当前shell下启动的子进程只继承环境变量,不继承局部变量
- shell允许把多个命令写成在一行,中间用分号隔开
内置变量
shell的标准变量
HOME
:用户主目录的路径名PATH
:作为命令的查找路径PS1
:设置B-shell的主提示符:$
PS2
:设置B-shell的副提示符:>
TERM
: 终端类型名LANG
或LANGUAGE
:语种
替换
- 替换是shell提供灵活性的最重要手段
文件名生成
- shell将文件名通配符展开成多个文件名的工作
变量替换
- 将脚本文件中的$打头的单词,替换为变量值
命令替换
- 用两个反撇号(`)括起来一个命令,用命令执行的标准输出代替两个反撇号标记出的字段
元字符
- 元字符:在shell中有特殊含义的字符,shell对这些字符进行特殊解释
空格,制表符和转义符
- 空格:做单词之间的分隔符
- 水平制表符:单词分隔符
回车和分号
- 回车:标志一个命令输入的结束
文件名通配符
- 文件名通配符
[ ],*,?
会被shell展开成多个文件名
美元符和反撇号
- 美元符:变量替换
- 反撇号:命令替换
重定向和管道
启动程序后台执行
&
符作为后台启动程序的元字符- shell不等待命令运行结束,就离开给出新的提示符,可以输入下个命令
括号
- 配对的括号之间的所有命令,会作为一个整体
转义符
- 取消紧跟其后的元字符的特殊作用
- 如果加在不是元字符的其他字符前面,这个反斜线跟没有一样
双引号和单引号
- 在单引号内的所有字符都不再解释为元字符
- 双引号在括起的内容中保留了元字符
($)
和反撇号(
)`,只允许变量替换和命令替换
转义符与引号及反撇号
- 在配对的双引号括起来的内容中,只允许", $, `, \这四个转义序列
- 在配对的单引号内不允许任何转义
条件判断
条件
- shell变量只有字符串一种变量类型
- 策略与机制分离:shell仅仅提供一种机制,但不提供解决问题的策略,所有策略外包给其他的命,或者用户自己编写的应用程序
- 判断方法是根据命令执行的反悔码,返回0:条件成立,返回非0的任意值,都算条件不成立
- 返回码的取值在0~255之间
- 在shell中,有一个内置变量
$?
,它是上个命令执行结束后的返回码的值
最简单的条件判断
- 仅含有一个分支
命令1 && 命令2
:若命令1执行成功(返回码为0)则执行命令2,否则不执行命令2命令1 || 命令2
:若命令1执行失败(返回码为0)则执行命令2,否则不执行命令2
命令true和flase
- 都不是shell的关键字
true
命令的返回码总为0,除此之外不做任何操作flase
命令的返回码总不为0
命令test与命令[
test
可以提供一些常用的条件判断[
要求最后一个命令行参数必须为右方括号
文件特性检测
-f
:普通文件-d
:目录文件-s
:size>0-r
:可读-w
:可写-x
:可执行
字符串比较
- -
Z: str1
: str1串长度等于零(zero) -n: str1
:str1串长度不等于零(non-zero)str1 = str2
:str1串与str2串相等str1 != str2
:str1串与str2串不相等
整数比较
-eq
: equal-gr
: greater than-ge
: greater or equal-ne
: not equal-lt
: less than-le
: less or equal
逻辑运算:
!
: NOT (非)-0
: OR (或)-a
: AND (与)- 等号两侧必须有空格
{ }与( )
- 左大括号后面必须有一个空格,右大括号前面必须有一个分号:
{ list;}
- 换行可不写
" ; "
- 括号
( )
是shell的元字符,不需要空格和分号:(list)
- 大括号括起的一组命令是在
shell
进程中执行,但是,括号括起的一组命令,却是在子shell
中执行 - 用{ }会比( )执行效率更高些
条件结构if
- 语法:
if conditon
then list (空格可有可无)
elif condition
then list
else
list
fi
case结构
- 语法:
case word in
pattern1) pat1_list;;(;;)是一个整体,不可分割
pattern2) pat2_list;;
esac
循环结构
while结构
- 语法:
while condition
do list
done
expr: 计算表达式的值
算数运算和关系运算
- 运算法两侧的空格是必不可少的
字符串运算
- 用法:
expr string : pattern
: 用正则表达式pattern去匹配字符串string。从最左字符开始,尽量匹配,看能匹配多长,最终打印出匹配的长度值,不匹配时打印0
for结构
- 语法:
for name in word1 word2 ...
do list
done
break与continue
函数
- 语法:
name( ) { list;}
- shell函数不允许递归调用
- 可以用#号作注释
shell开关和位置配置
- set命令后不跟任何参数时,列出shell的所有变量,包括局部变量和环境变量
set:设置B-shell内部开关
-x
: 在执行每条命令时,先打印出这个命令及命令参数+x
: 取消上述设置-u
: 当引用一个未赋值的变量时,产生一个错误+u
: 当引用一个未赋值的变量时,认为是一个空串
set:设置shell位置变量
- shell命令后边跟多个参数,可以修改shell的位置变量
shift:位置变量的移位
- 功能:使位置变量“移位“