第六章 B-shell及编程

启动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: 终端类型名
  • LANGLANGUAGE:语种

替换

  • 替换是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:位置变量的移位

  • 功能:使位置变量“移位“
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值