jinhucheung / blog

学习笔记
6 stars 3 forks source link

Linux 学习之认识Bash #21

Open jinhucheung opened 8 years ago

jinhucheung commented 8 years ago

Index

jinhucheung commented 8 years ago

1. 认识Bash

1.1 硬件/内核/Shell

硬件/内核/Shell三者关系如下图:

就是说:Shell是一个应用程序,解析用户输入(点击鼠标/键盘)的命令,然后去调用相应的应用程序完成功能

1.2 系统上的Shell

一个Linux下支持多种的Shell,它们在/etc/shells这个文件中

 /bin/sh  (第一个流行的Shell,已被Bash代替)
 /bin/bash (兼容sh,Linux默认的Shell)
 /bin/tcsh  (整合C shell)
 /bin/ksh  (兼容Bash)

系统会为每个登陆的用户指定一个Shell,当然也有no-login的Shell,我们可以在/etc/passwd中查看到用户指定的Shell

1.3 Bash的功能

1.4 查看命令的类型(type)

当我们在终端执行命令时,命令可分为alias别名命令,bash内置命令,外部程序

我们可以使用type 命令名查看此命令的类型

jinhucheung commented 8 years ago

2. Shell的变量

2.1 变量的显示与设置

变量的显示 : echo echo $varname 或者 echo ${varname}

.

变量的设置规则

  1. 变量与变量值以一个等号"="连接,如var=value
  2. 等号两边不能直接接空格,如var= value(错误的)
  3. 变量名只能是英文或数字,不能以数字开头
  4. 变量值若有空格可以用""或''括起来,其中""保持特殊字符的原本特性,''则将特殊字符视为一般字符
  5. 可以使用转义字符"\"转义特殊字符
  6. 如要定义变量时引用另一个变量的值,如path="$path:other"path=${path}:other
  7. 定义变量时引用命令处理结果,可以使用$(command)
  8. 环境变量(子进程可以使用的变量,通过bash开启子进程)用export来定义变量
  9. 自定义变量名用小写,系统变量用大写

.

变量的取消: unset varname

2.2 变量的有效范围

变量分为一般变量与环境变量,环境变量可以在子进程中引用,也叫全局变量. 当启动一个Shell,操作系统会分配一个内存记录块给Shell的进程维护. 进程使用export,将一般变量写到其的内存记录块中. 当启动子进程,子进程将父进程的内存记录块中的信息导入自己的环境变量块中.

我们使用export将一般变量转出环境变量 bash启动子进程后,父进程会sleep

2.3 查看系统的变量

查看环境变量 : env

  • HOME : 用户主文件夹
  • SHELL: 用户使用的Shell
  • HISTSIZE: 历史命令条数
  • PATH : 执行文件查找路径
  • LANG : 语系
  • RANDOM: 生成随机数

.

查看所有变量(含环境变量及自定义变量) : set

  • PS1 : 命令提示符
  • $ : 关于此Shell的PID
  • ? : 上个命令的回传码,0表示执行成功
  • - : 被unset的变量
  • OSTYPE: 操作系统类型
  • HOSTTYPE: 主机架构,i686 x86_64等

.

查看系统当前支持的语系 : locale

  • 如果用户需要设置shell的语系,可以设置LANG或LC_ALL的值(注销后失效)
  • 如果要设置系统的语系,需要在/etc/sysconfig/i18n(CentOS)或/etc/default/locale(ubuntu)设置

2.4 变量值键盘读取/声明变量类型

变量值键盘读取 : read

  • 格式 : read [-pt] varname
  • p: 接提示符
  • t:等待时限

.

声明变量类型: declare/typeset

  • 格式: declare [-aixr] varname
  • a 定义数组变量
  • i 定义整型变量
  • x 定义环境变量
  • r 定义readonly变量
    注意: 我们读取数组变量值时,需要使用${varname[1]},${varname[2]}这种格式(所以我们读取变量时最好习惯成${varname})
jinhucheung commented 8 years ago

2.5 变量值的删除/替换/测试

变量值的删除与替换设置方式如下表

变量设置方式 说明 备注
${变量#关键字} 若变量值从头开始的数据,则将符合的最短数据删除 从头开始,最短匹配
${变量##关键字} 若变量值从头开始的数据,则将符合的最长数据删除 从头开始,最长匹配
${变量%关键字} 若变量值从尾开始的数据,则将符合的最短数据删除 从尾开始,最短匹配
${变量%%关键字} 若变量值从尾开始的数据,则将符合的最长数据删除 从尾开始,最长匹配
${变量/旧字符/新字符} 将变量值中第一个符合旧字符的数据替换 第一个替换
${变量//旧字符/新字符} 将变量值中全部符合旧字符的数据替换 全部替换

测试变量值的测试方式如下表

变量设置方式 var没有设置 var为空字符 var已设置非空字符
testvar=${var?tipstr} 将tipstr输出至stderr testvar= testvar=var
testvar=${var:?tipstr} 将tipstr输出至stderr 将tipstr输出至stderr testvar=var
jinhucheung commented 8 years ago

3. Bash的操作环境

3.1 命令查找顺序

  1. 以相对/绝对路径执行的命令alias
  2. 由alias找到此别名命令来执行
  3. 由bash内置的builitin命令执行
  4. 通过$PATH查找执行

3.2 命令别名与历史命令

命令别名: alias

  • 查看当前系统内的别名命令 : alias
  • 设置别名命令 : alias name=commad
  • 取消别名命令 : unalias name

.

历史命令: history

  • 列出目前内存中的历史命令 : hitory ([-n]:表示最近n条命令)
  • 历史命令默认保存在~/.bash_history中,最大保存$HISTSIZE条,当Shell注销时,就会将内存中的历史命令写入~/.bash_history(强制写入hitory -w)

3.3 Bash的欢迎与登录信息

/etc/issue 记录Bash的欢迎信息 /etc/issue.net 记录远程Bash的欢迎信息 /etc/motd 记录用户登录后提示的信息

3.4 Bash的环境配置文件

我们需要将设置好的环境(如命令别名,自定义变量)写入到bash的环境配置文件中才能持久生效,否则在注销后都会失效.

那要写入到哪个bash的环境配置文件? bash分为"login shell" 与"non-login shell",两者读取的环境配置文件有差异,如下图所示:

当我们需要设置bash环境时,可以在~/.bashrc中设置

其他的bash配置文件:

3.5 Bash的通配符与特殊符号

常用通配符如下表:

符号 意义
* 代表0到无穷多个任意字符
? 一定有1个任意字符
[] 代表一定有一个[]内的字符
[-] 代表编码顺序内的所有字符
[^] 代表含有非[]内的字符

bash的特殊符号如下表:

符号 意义
# 注释符号
\ 转义符号
; 连续命令执行分隔符
~ 用户主目录
$ 变量前导符
& 作业控制,将命令变成后台工作
! 逻辑非
/ 目录符号
>,>> 数据重定向,输出导向,分别是'替换'与'累加'
<,<< 数据重定向,输入导向,<<后接一个尾符,表示遇到此尾符,结束输入
'' 单引号,特殊字符转为一般字符
"" 双引号,特殊字符保持殊性
`` 先执行的命令,可使用$()代替
{} 命令块组合
jinhucheung commented 8 years ago

4. 数据重定向

当我们执行一个命令是输出结果信息或错误信息都是输到屏幕上的,这两个流我们称为标准输出(stdout)与标准错误输出(stderr),此外还有一个从文件读入数据的流称为标准输入(stdin)

可是当我们想将输出信息输出到文件时,此时不能使用stdout/stderr流,我们需要将它们导向,故称为数据重定向

数据重定向的特殊字符规则如下:

  1. 标准输入(stdin),代码为0,使用<或<<
  2. 标准输出(stdout),代码为1,使用>或>>
  3. 标准错误输出(stderr),代码为2,使用2>或2>>

例子:

  1. 查看根目录文件信息并输出到~/rootfile中: ll / > ~/rootfile (文件不存在,会自动创建)
  2. 查找/home中文件名为.bashrc并添加至~/rootfile中 : find /home -name .bashrc >> ~/rootfile
  3. 将ll filename的错误信息丢弃 : ll filename 2> /dev/null
  4. 将ll filename的结果信息及错误信息一同显示在~/rootfile中 ll filename > ~/rootfile 2>&1
  5. 将~/.bashrc的数据导进~/rootfile中 : cat > ~/rootfile < ~/.bashrc
  6. 从键盘输入信息到~/rootfile,并以"eof"表示结束输入 : cat > ~/rootfile <<"eof"
jinhucheung commented 8 years ago

5. 命令执行次序判断

当我们有一批命令需依次执行时,需要判断命令执行的次序.

jinhucheung commented 8 years ago

6. 管道命令

管道命令仅能处理stdout流传来的数据,对于stderr流会忽视,其将前一个命令的stdout流作为stdin输入,处理加工后再作为stdout输出,其中管道命令中用-表示stdin或stdout

6.1 选取命令:cut/grep

6.2 排序命令:sort/wc/uniq

6.3 双向重定向:tee

tee可以将stdout转存到文件,并以同样的数据往下传递(即 tee可以将数据同时流向文件和屏幕)

例子:将用户登录信息存到last.list并显示在屏幕上
last | tee ~/last.list | more

6.4 字符转换命令

6.5 切割命令

6.6 参数代换:xargs