bash--鸟哥私房菜读书笔记

本文详述了Bash Shell的功能特性,包括命令记忆、档案补全、别名设定、工作控制、程序化脚本和通配符使用。同时探讨了内建命令如type,变量功能,命令别名与历史命令,操作环境设置,以及管线命令的应用,如cut、grep、sort等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Bash shell 的功能及特点

1. 命令记忆能力(history)

我只要在指令列按『上下键』就可以找到前/后一个输入的指令。~/.bash_history 记录的是前一次登入以前所执行过的指令, 而至于这一次登入所执行的指令都被暂存在内存中,当你成功的注销系统后,该指令记忆才会记录到 .bash_history 当中。

2. 命令与档案补全功能: ([tab] 按键的好处)

[Tab] 接在一串指令的第一个字的后面,则为命令补全;
[Tab] 接在一串指令的第二个字以后时,则为『档案补齐』。

3. 命令别名设定功能: (alias)

你可以在指令列输入 alias 就可以知道目前的命令别名有哪些了,也可以直接下达命令来设定别名:
alias lm='ls -al'

4. 工作控制、前景背景控制: (job control, foreground, background)

使用前、背景的控制可以让工作进行的更为顺利!至于工作控制(jobs)的用途则更广, 可以让我们随时将工作丢到背景中执行。

5. 程序化脚本: (shell scripts)

可以将你平时管理系统常需要下达的连续指令写成一个档案, 该档案不但可以通过对谈交互式的方式来进行主机的侦测工作,还可以藉由 shell 提供的环境变量及相关指令来进行设计。

6. 通配符: (Wildcard)

ash 还支持许多的通配符来帮助用户查询与指令下达。

Bash shell 的内建命令: type

type [-tpa] name
选项与参数:
:不加任何选项与参数时,type 会显示出 name 是外部指令还是 bash 内建指令
-t :当加入 -t 参数时,type 会将 name 以底下这些字眼显示出他的意义:
file :表示为外部指令;
alias :表示该指令为命令别所设定的名称;
builtin :表示该指令为 bash 内建的指令功能;
-p :如果后面接的 name 为外部指令时,才会显示完整文件名;
-a :会由 PATH 变量定义的路径中,将所有含 name 的指令都列出来,包含 alias

Shell 的变量功能

变量的可变性与方便性;
影响 bash 环境操作的变量:环境变量例如 PATH、HOME、MAIL、SHELL 等等,为了区别与自定义变量的不同,环境变量通常以大写字符来表示;
脚本程序设计 (shell script) 的好帮手。

1. 变量的取用:echo

利用 ehco 就能够读出,只是需要在变量名称前面加上 $ , 或者是以 ${变量} 的方式来获取都可。

2. 变量的设定和修改

用『等号(=)』连接变量与他的内容就好。

3. 变量的设定规则

a. 变量与变量内容以一个等号『=』来连结
b. 等号两边不能直接接空格
c. 变量名称只能是英文字母与数字,但是开头字符不能是数字
d. 变量内容若有空格符可使用双引号『"』或单引号『'』将变量内容包含起来:
双引号内的特殊字符如 $ 等,可以保有原本的特性,如下所示:
『var="lang is $LANG"』则『echo $var』可得『lang is en_US』
单引号内的特殊字符则仅为一般字符 (纯文本),如下所示:
『var='lang is $LANG'』则『echo $var』可得『lang is $LANG』
e. 可用跳脱字符『 \ 』将特殊符号(如 [Enter], $, \, 空格符, '等)发成一般字符
f. 在一串指令中,还需要藉由其他的指令提供的信息,可以使用反单引号『`指令`』戒 『$(指令)』:『version=$(uname -r)』再『echo $version』可得『2.6.18-128.el5』
g. 若该变量为扩增变量内容时,则可用 "$变量名称" 或 ${变量} 累加内容:『PATH="$PATH":/home/bin』
h. 若该变量需要在其他子程序执行,则需要以 export 来使变量变成环境变量
i. 通常大写字符为系统默认变量,自行设定变量可以使用小写字符,方便判断
j. 取消变量的方法为使用 unset:『unset 变量名称』如『unset myname』

4. 环境变量的功能

用 env 观察环境变量与常见环境变量说明;
用 set 观察所有变量 (含环境变量与自定义变量)
用export: 自定义变量转成环境变量
环境变量与自定义变量有啥差异呢?其实这两者的差异在于『 该变量是否会被子程序所继续引用』

5. 影响显示结果的语系变量 (locale)

locale -a
locale

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

read [-pt] variable
-p :后面可以接提示字符!
-t :后面可以接等待的『秒数!』这个比较有趣~不会一直等待使用者
declare [-aixr] variable
-a :将后面名为 variable 的变量定义成为数组 (array) 类型
-i :将后面名为 variable 的变量定义成为整数数字 (integer) 类型
-x :用法与 export 一样,就是将后面的 variable 变成环境变量;
-r :将变量设定成为 readonly 类型,该变量不可被更改内容,也不能 unset
设定为数组变量类型:var[index]=content
var[1]="small min"
var[2]="big min"
echo "${var[1]}, ${var[2]}"

7. 文件系统及程序的限制关系: ulimit

ulimit [-SHacdfltu] [配额]
-H :hard limit ,严格的设定,必定不能越过这个设定的数值;
-S :soft limit ,警告的设定,可以越过这个设定值,但是若越过则有警告讯息。
-a :后面不接任何选项与参数,可列出所有的限制额度;
-c :当某些程序发生错误时,系统可能会将该程序在内存中的信息写成档案(除错用), 这种档案就被称为核心档案(core file)。此为限制每个核心档案的最大容量。
-f :此 shell 可以建立的最大档案容量(一般可能设定为 2GB)单位为 Kbytes
-d :程序可使用的最大断裂内存(segment)容量;
-l :可用于锁定 (lock) 的内存量
-t :可使用的最大 CPU 时间 (单位为秒)
-u :单一用户可以使用的最大程序(process)数量。

8. 变量内容的删除与取代

${变量#关键词} 若变量内容从头开始的数据符合『关键词』,则将符合的最短数据删除
${变量##关键词}  若变量内容从头开始的数据符合『关键词』,则将符合的最长数据删除
${变量%关键词} 若变量内容从尾向前的数据符合『关键词』,则将符合的最短数据删除
${变量%%关键词}  若变量内容从尾向前的数据符合『关键词』,则将符合的最长数据删除
${变量/旧字符串/新字符串} 若变量内容符合『旧字符串』则『第一个旧字符串会被新字符串取代』
${变量//旧字符串/新字符串}  若变量内容符合『旧字符串』则『全部的旧字符串会被新字符串取代』
path="/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin"
path=${path#/*bin:} #"/usr/sbin:/usr/local/bin:/usr/local/sbin"
path=${path##/*bin:} #"/usr/local/sbin"
path=${path%:*sbin} #"/usr/bin:/usr/sbin:/usr/local/bin"
path=${path%%:*sbin} #"/usr/bin"
path=${path/sbin/SBIN} #"/usr/bin:/usr/SBIN:/usr/local/bin:/usr/local/sbin"
path=${path//sbin/SBIN} #"/usr/bin:/usr/SBIN:/usr/local/bin:/usr/local/SBIN"

9. 变量的测试与内容替换

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

命令别名与历史命令

1. 命令别名设定: alias, unalias

alias 的定义规则与变量定义规则几乎相同,你只要在 alias 后面加上你的 『别名』='指令 选项...' 

2. 历史命令:history

history [n]
n :数字,意思是『要列出最近的 n 笔命令行表』的意思
history [-c]
-c :将目前的 shell 中的所有 history 内容全部消除
history [-raw] histfiles
-a :将目前新增的 history 指令新增入 histfiles 中,若没有加 histfiles , 则预设写入 ~/.bash_history
-r :将 histfiles 的内容读到目前这个 shell 的 history 记忆中;
-w :将目前的 history 记忆内容写入 histfiles 中

Bash Shell 的操作环境

1. 路径与指令搜寻顺序

1. 以相对/绝对路径执行指令,例如『 /bin/ls 』或『 ./ls 』;
2. 由 alias 找到该指令来执行;
3. 由 bash 内建的 (builtin) 指令来执行;
4. 透过 $PATH 这个变量的顺序搜寻到的第一个指令来执行。

2. bash 的进站与欢迎信息

 /etc/issue, /etc/motd
\d 本地端时间的日期;
\l 显示第几个终端机接口;
\m 显示硬件的等级 (i386/i486/i586/i686...);
\n 显示主机的网络名称;
\o 显示 domain name;
\r 操作系统的版本 (相当亍 uname -r)
\t 显示本地端时间的时间;
\s 操作系统的名称;
\v 操作系统的版本。

3. 环境配置文件

login shell:取得 bash 时需要完整的登入流程的,就称为 login shell。例如,你要由 tty1 ~ tty6 登入,需要输入用户的账号和密码,此时取得的 bash 就称为『 login shell 』
non-login shell:取得 bash 接口的方法不需要重复登入的举动,比如,(1)你以 X window 登入 Linux 后, 再以 X 的图形化接口启动终端机(2)你在原本的 bash 环境下再次下达 bash 这个指令,同样的也没有输入账号密码, 那第二个 bash (子程序) 也是 non-login shell

login shell 其实只会读取这两个配置文件:
1. /etc/profile:这是系统整体的设定,你最好不要修改这个档案;
2. ~/.bash_profile 或 ~/.bash_login 戒 ~/.profile:属于使用者个人设定,你要改自己的数据,就写入这里
login shell 环境下,最终被读取的配置文件是『 ~/.bashrc 』这个档案喔!所以,你当然可以将自己的偏好设定写入该档案即可。
source 配置文件档名
利用 source 或小数点 (.) 都可以将配置文件的内容读进来目前的 shell 环境中!
non-login shell 这种非登入情况取得 bash 操作接口的环境配置文件是~/.bashrc

其他相关配置文件
/etc/man.config
这个档案的内容『规范了使用 man 的时候, man page 的路径到哪里去寻找!』
~/.bash_history
我们的历史命令就记录在这里
~/.bash_logout
这个档案则记录了『当我注销 bash 后,系统再帮我做完什么动作后才离开』的意思

bash 其他事项

1. bash 默认组合键

Ctrl + C 终止目前的命令
Ctrl + D 输入结束 (EOF),例如邮件结束的时候;
Ctrl + M 就是 Enter 啦!
Ctrl + S 暂停屏幕的输出
Ctrl + Q 恢复屏幕的输出
Ctrl + U 在提示字符下,将整列命令删除
Ctrl + Z 『暂停』目前的命令

2. 通配符与特殊符号

通配符:
* 代表『 0 个到无穷多个』任意字符
? 代表『一定有一个』任意字符
[ ] 同样代表『一定有一个在括号内』的字符(非任意字符)。例如 [abcd] 代表『一定有一个字符, 可能是 a, b, c, d 这四个任何一个』
[ - ] 若有减号在中括号内时,代表『在编码顺序内的所有字符』。例如 [0-9] 代表 0 到 9 之间的所有数字,因为数字的语系编码是连续的!
[^ ] 若中括号内的第一个字符为指数符号 (^) ,那表示『反向选择』,例如 [^abc] 代表 一定有一个字符,只要是非 a, b, c 的其他字符就接受的意思。
特殊字符:
# 批注符号:这个最常被使用在 script 当中,视为说明在#后的数据均不执行
\ 跳脱符号:将『特殊字符或通配符』还原成一般字符
| 管线 (pipe):分隔两个管线命令的界定;
; 连续指令下达分隔符:连续性命令的界定
~ 用户的家目录
$ 取用变量前导符:亦即是变量之前需要加的变量取代值
& 工作控制 (job control):将指令变成背景下工作
! 逻辑运算意义上的『非』 not 的意思!
/ 目录符号:路径分隔得符号
>, >> 数据流重导向:输出导向,分别是『取代』不『累加』
<, << 数据流重导向:输入导向
' ' 单引号,不具有变量置换的功能
" " 具有变量置换的功能
` ` 两个『 ` 』中间为可以先执行的指令,亦可使用 $( )
( ) 在中间为子 shell 的起始与结束
{ } 在中间为命令区块的组合

3. 数据流重导向

1. 标准输入 (stdin) :代码为 0 ,使用 < 或 << ;
2. 标准输出 (stdout):代码为 1 ,使用 > 或 >> ;
3. 标准错误输出(stderr):代码为 2 ,使用 2> 或 2>> ;
 1> :以覆盖的方法将『正确的数据』输出到只定的档案或装置上;
 1>>:以累加的方法将『正确的数据』输出到只定的档案或装置上;
 2> :以覆盖的方法将『错诨的数据』输出到只定的档案或装置上;
 2>>:以累加的方法将『错诨的数据』输出到只定的档案或装置上;
如:ll / > ~/rootfile

4. 命令执行的判断依据

cmd ; cmd
不考虑指令相关性的连续指令下达
cmd1 && cmd2
若 cmd1 执行完毕且正确执行($?=0),则开始执行 cmd2;若 cmd1 执行完毕且为错误 ($?≠0),则 cmd2 不执行。
cmd1 || cmd2
若 cmd1 执行完毕且正确执行($?=0),则 cmd2 不执行;若 cmd1 执行完毕且为错误 ($?≠0),则开始执行 cmd2。

管线命令 (pipe)

管线命令『 | 』仅能处理经由前面一个指令传来的正确信息,也就是 standard output 的信息,对于 stdandard error 并没有直接处理的能力;每个管线后面接的第一个数据必定是『指令』,而且这个指令必须要能够接受 standard input 的数据才行,这样的指令才可以是为『管线命令』

1. 截取命令:cut, grep

cut 是将一行讯息当中,取出某部分我们想要的
cut -d'分隔字符' -f fields <==用于有特定分隔字符
cut -c 字符区间 <==用于排列整齐的讯息
-d :后面接分隔字符。与 -f 一起使用;
-f :依据 -d 的分隔字符将一段讯息分割成为数段,用 -f 取出第几段的意思;
-c :以字符 (characters) 的单位取出固定字符区间;
grep 则是分析一行讯息, 若当中有我们所需要的信息,就将该行拿出来
grep [-acinv] [--color=auto] '搜寻字符串' filename
-a :将 binary 档案以 text 档案的方式搜寻数据
-c :计算找到 '搜寻字符串' 的次数
-i :忽略大小写的不同,所以大小写规为相同
-n :顺便输出行号
-v :反向选择,亦即显示出没有 '搜寻字符串' 内容的那一行!
--color=auto :可以将找到的关键词部分加上颜色显示

2. 排序命令: sort, wc, uniq

排序显示
sort [-fbMnrtuk] [file or stdin]
-f :忽略大小写的差异,例如 A 与 a 规为编码相同;
-b :忽略最前面的空格符部分;
-M :以月份的名字来排序,例如 JAN, DEC 等等的排序方法;
-n :使用『纯数字』进行排序(默认是以文字型态来排序的);
-r :反向排序;
-u :就是 uniq ,相同的数据中,仅出现一行代表;
-t :分隔符,预设是用 [tab] 键来分割;
-k :以那个区间 (field) 来进行排序的意思
如果排序完成了,要将重复的资料仅列出一个显示
uniq [-ic]
-i :忽略大小写字符的不同;
-c :进行计数
计算字数,行数,字符数
wc [-lwm]
-l :仅列出行;
-w :仅列出多少字(英文单字);
-m :多少字符;

3. 双向重导向: tee

tee 会同时将数据流分送到文件和屏幕 (screen);而输出到屏幕的,其实就是 stdout ,可以让下个指令继续处理
tee [-a] file
-a :以累加 (append) 的方式,将数据加入 file 当中!
如ls -l /home | tee ~/homefile | more 即写入文件又在屏幕上显示

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

删除一段讯息当中的文字,或者是进行文字讯息的替换
tr [-ds] SET1 ...
-d :删除讯息当中的 SET1 这个字符串;
-s :取代掉重复的字符!
如last | tr '[a-z]' '[A-Z]'  将 last 输出的讯息中,所有的小写变成大写字符
col [-xb]
-x :将 tab 键转换成对等的空格键
-b :在文字内有反斜杠 (/) 时,仅保留反斜杠最后接的那个字符
两个档案当中,有 "相同数据" 的那一行,才将他加在一起
join [-ti12] file1 file2
-t :join 默认以空格符分隔数据,并且比对『第一个字段』的数据, 如果两个档案相同,则将两笔数据联成一行,且第一个字段放在第一个!
-i :忽略大小写的差异;
-1 :这个是数字的 1 ,代表『第一个档案要用那个字段来分析』的意思;
-2 :代表『第二个档案要用那个字段来分析』的意思。
直接『将两行贴在一起,且中间以 [tab] 键隔开』
paste [-d] file1 file2
-d :后面可以接分隔字符。预设是以 [tab] 作为分隔符 
- :如果 file 部分写成 - ,表示来自 standard input 的资料的意思
将 [tab] 按键转成空格键
expand [-t] file
-t :后面可以接数字。一般来说,一个 tab 按键可以用 8 个空格键取代。

5. 分割命令: split

帮你将一个大档案,依据档案大小或行数来分割
split [-bl] file PREFIX
-b :后面可接欲分割成的档案大小,可加单位,例如 b, k, m 等;
-l :以行数来进行分割。
PREFIX :代表前导符的意思,可作为分割档案的前导文字

6. 参数代换: xargs

xargs [-0epn] command
-0 :如果输入的 stdin 含有特殊字符,例如 `, \, 空格键等等字符时,这个 -0 参数 可以将他还原成一般字符。这个参数可以用于特殊状态喔!
-e :这个是 EOF (end of file) 的意思。后面可以接一个字符串,当 xargs 分析到这个字符串时,就会停止继续工作!
-p :在执行每个指令的 argument 时,都会询问使用者的意思;
-n :后面接次数,每次 command 指令执行时,要使用几个参数的意思

7. 关于减号 - 的用途

某些指令需要用到文件名 (例如 tar) 来进行处理时,该 stdin 与 stdout 可以利用减号 "-" 来替代。
如:tar -cvf - /home | tar -xvf -
『我将 /home 里面的档案给他打包,但打包的数据不是记录到档案,而是传送到stdout; 经过管线后,将 tar -cvf - /home 传送给后面的 tar -xvf - 』。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值