bash学习笔记

文档更新记录

版本 更新时间 更新人 更新内容
V0.1 2015-07-26 孙凤影 bash shell学习笔记整理

系统的合法shell与/etc/shells功能

Bash shell 的功能

命令编修能力

通常用户在bash下输入命令时不必把命令输全,shell就能判断出你所要输入的命令。该功能的核心思想是:bash根据用户已输入的信息来查找以这些信息开头的命令,从而试图完成当前命令的输入工作。用来执行这项功能的键是Tab键,按下Tab键后,bash就试图完成整个命令的输入,并将列出所有能够与当前输入字符相匹配的命令列表。

命令与档案补全功能

命令别名设定功能

别名是bash中用来节省时间的另一项重要功能,它允许用户按照自己喜欢的方式对命令进行自定义。

别名的创建:alias接命令,例:

alias lm=‘ls -al’

别名的取消:用unalias 取消别名,例:

unalias lm

工作控制、前景背景控制

程序化脚本(简单)

通配符

通配符*的常用方法就是查找具有相同扩展名的文件,比如:

ls *.tar.gz

通配符*有时可以将几百的命令缩短成一个命令。

rm -f *.jpg

问号通配符?必须匹配一个且只能匹配一个字符,通常用来查找比*更为精确的匹配。

ls *.???

Bash shell的内建命令:type

查询是否是bash内部命令:type -t 命令名

file --外部命令;
alias --命令别名;
builtin --内部命令

指令的下达

变量的取用与设定

echo $PATH
echo ${PATH}

变量设计规则

  1. 环境变量大写,私有变量小写:变量名称只能是字母与数字,开头字符不能是数字
  2. 变量与内容以”=”连接,等号两边不能空格;变量内容若有空格可是有””or’’括起
  3. 区分”” 与’’的使用,前者保留特性,后者内的特殊字符仅为一般字符unset
  4. 变量内容可以是命令提供的信息

    version=uname -r or
    version=$(uname -r)

  5. 变量可以累加内容:PATH=”$PATH”:/home/bin

  6. 自定义变量变成环境变量:export mypath

环境变量的功能:env 不常见环境变量说明, set, export

  • HOME:代表home目录,cd /home 即取用这个变量
  • SHELL:告知目前环境使用的shell是哪支程序

/etc/shells:系统中可用的shell版本

/bin/sh
/bin/bash
/sbin/nologin …
/etc/passwd : 当前用户默认采用哪个shell来工作
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
...
  • HISTSIZE:曾经下达过的命令可以被系统记下来,记录的笔数有这个值来设定。在命令行中输入的每个命令都被保存到一个称为history(命令历史记录)的地方
  • MAIL:当我们使用mail这个指令在收信时,系统会去读取的邮件信箱档案(???)
  • PATH:执行文件的路径,目录与目录中间以冒号分隔
  • LANG:语系数据
  • RANDOM:随机取得数值。在BASH环境下,RANDOM变量的内容介于0~32767之间,echo $random时系统会随机取出一个介于0~32767的数值。用declare宣告数据类型
  • 用set观察所有变量(环境变量、自定义变量)

环境变量:所谓环境,就是各项shell下的控制及设备,包括终端机类型,文件搜索路径,用户目录等。用户在shell下执行程序时,有些程序会用到一些环境变量。登录系统时的工作之一就是在用户登录时就将个人的环境建立好。
自定义变量:自定义变量除了在每个进程都能调用的环境变量,还可以设置只能在当前进程使用的私有变量。

PS1:(提示字符的设定)
\d:显示星期 月 日的日期格式。
\H:完整的主机名。
\h:仅取主机名在第一个小数点之前的数据。
\t:显示时间,24小时格式
\T:显示时间,12小时格式
\A:显示时间,24小时格式
\@:显示时间,12小时格式。
\u:目前使用者的账号,如[root]。
\v:BASH的版本信息。
\w:完整的工作目录名称,由根目录写起的目录名称。
\W:利用basename函数取得工作目录名称,仅列出最后一个目录名。
\#:下达的第几个指令。
\$:提示字符
$、?、OATYPE、HOSTTYPE、MACHTYPE:(主机硬件与核心的等级)

export:自定义变量转换成环境变量

影响显示结果的语系变量 (locale) (要回前面章节看看)

变量的有效范围

变量可否被引用与export有关,被export后的变量成为环境变量,环境变量可以被子程序引用,自定义变量内容不会存在于子程序中。当启动一个shell,操作系统会分配一记忆区块给shell使用,此内存内之变量可让子程序取用;若在父程序利用export功能,可以让自定义变量的内容写到上述的记忆区块当中(环境变量);当加载另一个shell时,子shell可以将父程序的环境变量所在的记忆区块导入自己的环境变量区块当中。

变量键盘读取、数组与宣告: read, declare, array

read atest 、declare或typeset:宣告变量的类型

与文件系统和程序的限制关系:ulimit

选项 参数
-H Hard limit ,严格的设定,必定不能超过这个设定的数值
-S Soft limit,警告的设定,可以超过这个设定值,但是若超过则有警告讯息
-a 后面不接任何选项与参数,可列出所有的限制额度
-c 当某些程序发生错误时,系统可能会将该程序在内存中的信息写成档案,这种档案为核心档案,此为限制每个核心档案的最大容量
-f 此shell可以建立的最大档案容量
-d 程序可使用的最大断裂内存
-l 可用于锁定的内存量
-t 可使用的最大CPU时间
-u 单一用户可以使用的最大程序数量

变量内容的删除、取代和替换

删除:

变量设定方式 说明
${变量#关键词} 若变量内容从头开始的数据符合[关键词],则将符合的最短数据删除
${变量##关键词} 若变量内容从头开始的数据符合[关键词],则将符合的最长数据删除
${变量%关键词} 若变量内容从尾开始的数据符合[关键词],则将符合的最短数据删除
${变量%%关键词} 若变量内容从尾开始的数据符合[关键词],则将符合的最长数据删除
${变量/旧字符串/新字符串} 若变量内容符合旧字符串,则第一个旧字符串会被新字符串所取代
${变量//旧字符串/新字符串} 若变量内容符合旧字符串,则全部的旧字符串会被新字符串所取代

测试与内容替换:

变量设定方式 Str没有设定 Str为空字符串 Str已设定为非空字符串
var=${str-expr} var=expr var= var=$str
var=${str:-expr} var=expr var=expr var=$str
var=${str+expr} var= var=expr var=expr
var=${str:+expr} var= var= var=expr
var=${str=expr} str=expr str不变 str不变
var=expr var= var=$str
var=${str:=expr} str=expr str=expr str不变
var=expr var=expr var=$str
var=${str?expr} expr输出至stderr var= var=$str
var=${str:?expr} expr输出至stderr expr输出stderr var=$str

命令别名设定: alias, unalias(取消)

历史命令: history, HISTSIZE

history [n]…………

选项与参数 说明
n 列出最近的n笔命令行表
-c 将目前的的shell中的所有history内容全部消除
-a 将目前新增的history指令新增入histfiles中,若没有加histfiles,则预设写入~/.bash_history
-r 讲histfiles的内容读到目前这个shell的history记忆中
-w 将目前的history记忆内容写入histfiles中

在正常的情况下,历史命令的读取与记录是这样的:
当我们以bash登入Linux主机之后,系统会主动的由家目录的~/.bash_history读取以前曾经下过的命令,那么~/.bash_history记录的数据与bash的HISTFILESIZE这个变量的设定有关.

路与指令搜寻顺序

  1. 以相对/绝对路径执行指令
  2. 由alias找到该指令来执行
  3. 由bash内建的builtin指令来执行
  4. 透过$PATH这个变量的顺序搜寻到的第一个指令来执行

bash 的进站与欢迎讯息:/etc/issue,/etc/motd

环境配置文件: login, non-login shell, /etc/profile, ~/.bash_profile, source, ~/.bashrc (内容比较繁杂**

终端机的环境设定: stty, set

stty:设定终端机的输入按键代表意义。stty –a

说明
eof End of life的意思,代表结束输入
erase 向后删除字符
intr 送出一个interrupt的信号给目前正在run的程序
kill 删除在目前指令列上的所有文字
quit 送出一个quit的讯号给目前正在run的程序
start 在某个程序停止后,重新启动他的output
stop 送出一个terminal stop的讯号给正在run的程序
susp

Set 设定整个指令输入/输出的环境:set [-uvCHhmBx]

选项与参数 说明
-u 预设不启用,若启用后,当使用未设定变量时,会显示错误讯息
-v 预设不启用,若启用后,在讯息被输出之前,会先显示讯息的原始内容
-x 预设不启用,若启用后,在指令被执行前,会显示指令内容
-h 预设启用。与历史命令有关。
-H 预设启用。与历史命令有关。
-m 预设启用。与工作管理有关。
-B 预设启用与括号[]的作用有关
-C 预设不启用。若使用>等,则若档案存在是,该档案不会被覆盖。

Bash默认的组合按键:

组合按键 执行结果
Ctrl+C 中止目前的命令
Ctrl+D 输入结束eof
Ctrl+M Enter
Ctrl+S 暂停屏幕的输出
Ctrl+Q 恢复屏幕的输出
Ctrl+U 在提示字符下,将整列命令删除
Ctrl+Z 暂停目前的命令

通配符与特殊符号

通配符:

符号 意义
* 代表0到无穷多个任意字符
代表一定有一个任意字
[] 代表一定有一个在括号内的字符
[-] 若有减号在中括号内时,代表在编码顺序内的所有字符
[^] 若中括号内的第一个字符为指数符号……,那表示反向选择

特殊符号:

符号 内容
# 批注符号:最常被使用在script当中,视为说明,在后的数据均不执行
\ 跳脱字符,将特殊字符或通配符还原成一般字符
管线:分隔两个管线命令的界定
连续指令下达分隔符:连续性命令的界定
~ 用户的家目录
$ 取用变数前导符:亦即是变量之前需要加的变量取代值
& 工作控制:降脂灵变成背景下工作
!
/ 目录符号:路径分隔的符号
>,>> 数据流重导向:输出导向,分别是取代与累加
<,<< 数据流重导向:输入导向
‘’ 单引号,不具有变量置换功能
“” 具有变量置换功能
() 在中间为子shell的起始与结束
{ } 在中间为命令区块的组合

数据流重导向?

标准输出:指令执行所回传的正确的讯息,读取/etc/ontab后,将该档案内容显示到屏幕上。

标准错误输出:指令执行失败后,所回传的错误讯息。Cat无法找到指令在屏幕上显示错误讯息。

数据流重导向将standard output 与standard error output 分别传送到其他的档案或装置去,而分别传送所用的特殊字符则如下表示:

  1. 标准输入(stdin):使用<或<<
  2. 标准输出(stdout):使用>或>>
  3. 标准错误输出(stderr):使用2>或2>>

命令执行的判断依据:;,&&,||

指令下达情况 说明
cmd1&&cmd2 1. 若cmd1执行完毕且为正确($?=0),则cmd2执行
2. 若cmd1执行完毕且为错误($?!=0),则cmd2不执行
cmd1\ \ cmd2 1. 若cmd1执行完毕且为正确($?=0),则cmd2不执行
2. 若cmd1执行完毕且为错误($?!=0),则cmd2执行

管线命令 (pipe)

管线命令仅会处理standard output,对于standard error output会予以忽略;管线命令必须能够结合搜来自前一个指令的数据成为standard input 继续处理。

攫取命令: cut, grep

cut –dfc:在一行讯息当中取出我们想要的。

选项与参数 说明
-d 后面接分隔字符,与-f一起连用
-f 一句-d的分隔字符讲一段讯息分割成数段,用-f取出第几段
-c 以字符的单位取出固定字符区间

grep:分析一行讯息,若当中有我们所需要的信息,就将改行拿出来。

选项与参数 说明
-a 将binary档案以text档案的方式搜寻数据
-c 计算找到‘搜寻字符串’的次数
-i 忽略大小写的不同,所以大小写视为相同
-n 顺便输出行号
-v 反向选择,显示出没有搜索字符串内容的那一行

排序命令: sort, uniq, wc

sort

选项与参数 说明
-f 忽略大小写的差异
-b 忽略最前面的空格符部分
-M 以月份的名字来排序
-n 使用存数字进行排序
-r 反向排序
-u 相同的数据中,仅出现一行代表
-t 分隔符
-k 以那个区间来进行排序的意思

Uniq:将重复的资料仅列出一个

选项与参数 说明
-i 忽略大小写字符的不同
-c 进行计数

Wc:计算讯息的整体数据,行、字符、字数等;显示登入账号数。

双向重导向:tee

tee可以让standard output转存一份档案内并将同样的数据继续送到屏幕去处理。

字符转换命令: tr, col, join, paste, expand

tr可以用来删除一段讯息中的文字,或者是进行文字讯息的替换。tr –ds …

选项与参数 说明
-d 删除讯息当中的…这个字符串
-s 取代掉重复的字符

col

选项与参数 说明
-x 将tab键转换成对等的空格键
-b 在文字内有反斜杠/时,仅保留反斜杠最后接的那个字符

Join:将有关系的资料放在一起

选项与参数 说明
-t Join默认以空格符分隔数据,并且比对第一个字段的数据,如果两个档案相同,则将两笔数据联成一行,且第一个字段房子啊第一个
-i 忽略大小写的差异
-1 代表第一个档案要用那个字段来分析
-2 代表第二个档案要用那个字段来分析

Paste:直接将两行贴在一起,中间以tab键隔开

选项与参数 说明
-d 后面可以接分隔字符,预设是以tab来分隔的
- 如果file部分写成-,表示来自standard input的资料

Expand:将tab键转换成空格键[-t]

分割命令: split :将一个大档案依据档案大小或行数来分隔

选项与参数 说明
-b 后面可接欲分割成的档案大小,可加单位
-l 以行数来进行分割
PREFIX 代表前导符,可作为分割档案的前导文字

参数代换

xargs:产生某个指令的参数。可以读入stdin的数据,以空格符或断行字符作为分辨,将stdin的资料分割成为arguments。

选项与参数 说明
-0 如果输入的stdin含有特殊字符,可以将它还原成一般字符
-e Eof的意思,后面可以接一个字符串,当xargs分析到这个字符串时,就会继续工作
-p 在执行每个指令的argument时,都会询问使用者
-n 后面接次数,每次command指令执行时,要使用几个参数的意思

关于减号 – 的用途

替代stdin、stdout