1.变量定义
变量=变量内容 如myName=Jocelyn
知识点如下:
- 等号连边不能有空格
- 变量只能以英文开头,只能是英文字母与数字。
- 变量内容有空格可用双引号"(特殊字符保留原有特性) 或单引号'(特殊字符仅为一般字符)将内容结合起来
- 可用跳脱字符\ 将特殊字符转为一般字符。
- 变量追加内容 myName="$myName":Brown
- 变量需要在其他子程序执行,需要以export来使变量变成环境变量。
- 通常系统变量使用大写字符,自定义一般使用小写字符。
- 取消变量的方法使用 unset: [unset 变量名称]
2.查看变量
- env 可用于观察环境变量
- export 展示所有环境变量
- set 可观察所有变量
几个比较重要的参数- PS1 『命令提示字符』
- \d :可显示出『星期 月 日』的日期格式,如:"Mon Feb 2"
- \H :完整的主机名。举例来说『study.centos.jocelyn』
- \h :仅取主机名在第一个小数点之前的名字,如鸟哥主机则为『study』后面省略
- \t :显示时间,为 24 小时格式的『HH:MM:SS』
- \T :显示时间,为 12 小时格式的『HH:MM:SS』
- \A :显示时间,为 24 小时格式的『HH:MM』
- @ :显示时间,为 12 小时格式的『am/pm』样式
- \u :目前使用者的账号名称,如『dmtsai』;
- \v :BASH 的版本信息,如鸟哥的测试主机版本为 4.2.46(1)-release,仅取『4.2』显示
- \w :完整的工作目录名称,由根目录写起的目录名称。但家目录会以 ~ 取代;
- \W :利用 basename 函数取得工作目录名称,所以仅会列出最后一个目录名。
- # :下达的第几个指令。
- $ :提示字符,如果是 root 时,提示字符为 # ,否则就是 $ 啰~
ps:更改参数可以修改成自己习惯的命令提示符 - $ 『关于本shell的PID』
- ? 『上个指令的回传值』
- OSTYPE,HOSTTYPE,MACHTYPE 『主机硬件与核心等级』
- export 『自定义变量转换为环境变量』
- locale 查看语系变量
配置文件在/etc/locale.conf
3.变量的有效范围
环境变量可在bash以及子程序中使用。自定义的变量只能在爱自身中使用。可通过export将自定义变量变为环境变量。
read,array,declare
read [-pt] variable
-p:提示符
-t:等待的秒数
declare/typeset『宣告变量的类型』
declare [-aixr] variable
-a:定义为array类型
-i:定义为interger类型
-x:定义为环境变量
-r:定义为readonly,不可更改也不能unset
ps: 默认为字符串,bash中的数值运算只到整数形态。
array 一维数组
ulimit 文件系统与程序的限制关系
ulimit [-SHacdfltu] [配额]
选项与参数:
-H :hard limit ,严格的设定,必定不能超过这个设定的数值;
-S :soft limit ,警告的设定,可以超过这个设定值,但是若超过则有警告讯息。
在设定上,通常 soft 会比 hard 小,举例来说,soft 可设定为 80 而 hard 设定为 100,那么你可以使用到 90 (因为没有超过 100),但介于 80~100 之间时, 系统会有警告讯息通知你!
-a :后面不接任何选项与参数,可列出所有的限制额度;
-c :当某些程序发生错误时,系统可能会将该程序在内存中的信息写成文件(除错用),
这种文件就被称为核心文件(core file)。此为限制每个核心文件的最大容量。 -f :此 shell 可以建立的最大文件容量(一般可能设定为 2GB)单位为 Kbytes
-d :程序可使用的最大断裂内存(segment)容量; -l :可用于锁定 (lock) 的内存量
-t :可使用的最大 CPU 时间 (单位为秒)
-u :单一用户可以使用的最大程序(process)数量。
变量内容的删除与替代
没看懂 ...
别名与历史命令
alias 与 unalias
alias ll="ls -al"
unalias ll
需要注意的是alias仅在当前的shell中生效,需要永久生效则需要更改 ~/.bashrc
history
history [n][-c]
history [-raw] histfiles
n:列出最近n笔命令
-c: 将当前的shell的history清空
-a: 将目前新增的history指令新增入histfiles中,没有histfiles则谢雨~/.bash_history
-r: 将 histfiles的内容读取到目前shell的history中
-w: 将目前的history写入histfiles中。
!
!number !command !!
number: 执行第几笔的意思
command: 最近的指令向前搜寻并执行
!!: 执行上一个指令
type -a command 查找指令搜寻顺序,先找到哪个就以哪个执行。
/etc/issue,/etc/motd bash的进站与欢迎讯息,简单提下 有兴趣的再细看。
bash的环境配置文件
login-shell会读取下面两个文件
1. /etc/profile:这是系统整体的设定,你最好不要修改这个文件;(不过很多重要的设定都在这个文件里。) /etc/profile.d/*.sh 所有的.sh 文件都会被呼入,可以观察下自己主机下有哪些脚本。
2. ~/.bash_profile 或 ~/.bash_login 或 ~/.profile:属于使用者个人设定可以定制。依照顺序读取,
前一个存在则不会往后读了。
source :读入环境配置文件的指令 可以不登出直接读取环境配置文件。
non-login shell 只会读
~/.bashrc
/etc/man_db.conf 有时候说明文档需要手动加进来,才能用man查看
~/.bash_history 历史指令记录
~/.bash_logout 注销bash后,系统做了什么动作再离开。可做一些备份或整理工作。
stty、set 终端机的设定,不建议修改~ 还是适应标准比较好呢。
列一下终端机的热键
Ctrl + c 终止当前命令
Ctrl + d EOF 输入结束
Ctrl + m Enter
Ctrl + s 暂停屏幕输出
Ctrl + q 恢复屏幕输出
Ctrl + u 在提示字符下,将整列命令删除
Ctrl + z 暂停 目前命令(不在屏幕上输出)在后台运行
Bash中的特殊符号
|符号 |内容 |
|-------|-----------:|
| # |批注符号:这个最常被使用在 script 当中,视为说明!在后的数据均不执行|
| \ |跳脱符号:将『特殊字符或通配符』还原成一般字符|
| | | 管线 (pipe):分隔两个管线命令的界定(后两节介绍)|
| ; |连续指令下达分隔符:连续性命令的界定 (注意!与管线命令并不相同)|
| ~ |用户的家目录|
| $ |取用变数前导符:亦即是变量之前需要加的变量取代值|
| & |工作控制 (job control):将指令变成背景下工作|
| ! |逻辑运算意义上的『非』 not 的意思!|
| / |目录符号:路径分隔的符号|
| > >> |数据流重导向:输出导向,分别是『取代』与『累加』|
| < <<< |数据流重导向:输入导向 (这两个留待下节介绍)|
| '' |单引号,不具有变量置换的功能 ($ 变为纯文本)|
| "" |具有变量置换的功能! ($ 可保留相关功能)|
| `` |两个『 ` 』中间为可以先执行的指令,亦可使用 $( )|
| () |在中间为子 shell 的起始与结束|
| {} |在中间为命令区块的组合!|
标准输入输出
0 标准输入 < <<
1 标准输出 > >>
2 标准错误输出 2> 2>>
find /home -name .bashrc > list_right 2> list_error
/dev/null 垃圾桶黑洞装置与特殊写法
可以将错误信息丢到黑洞不予理会
2>&1 将错误输出与输出放置同一个文件,需要采用特殊写法
> 表示覆盖式输出,>> 表示追加是输出、
> <表示从文件读取代替键盘输入。而<<则很难理解了,表示结束的输入字符。
> 如:<< "eof" 则表示遇到eof则终止输入。
命令执行的判断依据: ; , &&, ||
cmd ; cmd (不考虑指令相关性的连续指令下达)
$? (指令回传值) 与 && 或 || 逻辑判断符,根据命令回传值决定执行那些命令,是一个相当好玩的指令
管线命令 (pipe)
• 管线命令仅会处理 standard output,对于 standard error output 会予以忽略
• 管线命令必须要能够接受来自前一个指令的数据成为 standard input 继续处理才行。
简单来说就是管线命令前要有标准输出的产生,命令后要能接受标准输入。
管线命令后支持的命令大概有以下:
cut, grep, sort, wc, uniq, tee, tr, col, join, paste, expand, split, xargs
cut 主要的用途在于将『同一行里面的数据进行分解!』
# 试下这些命令你就知道什么意思了哦
export | cut -c 12-
# last 可以输出『账号/终端机/来源/日期时间』的数据,并且是排列整齐的
last | cut -d ' ' -f 1
grep 全文搜索 很好用的命令,多用就知道了!
grep [-acinv] [--color=auto] '搜寻字符串' filename
-a 将binary文件以text文件的方式搜寻数据
-c 计算找到'搜寻字符串'的次数
-i 忽略大小写的不同
-n 顺便输出行号
-v 反向选择,即显示没有'搜寻字符串'内容的文本
--color=auto 可以将找到的关键词部分加上颜色的显示
sort 排序
sort [-fbMnrtuk] [file or stdin]
-f 忽略大小写
-b 忽略最前面的空白字符
-M 按月份的名字排序
-n 按照数字进行排序
-r 反向排序
-t 分隔符,预设是用 [tab] 键来分隔;
-u unique 相同的数据只展示一条
-k 以那个区间 (field) 来进行排序的意思
uniq
uniq [-ic]
-i 忽略大小写
-c 计数
# 统计最近登录的用户次数
last | cut -d ' ' -f1 | sort | uniq -c
wc
wc [-lwm]
-l 仅列出行
-w 仅列出多少字
-m 多少字符
# 取得登入系统的总人次
last | grep [a-zA-Z] | grep -v 'wtmp' | grep -v 'reboot' | grep -v 'unknown' |wc -l
#由于 last 会输出空白行, wtmp, unknown, reboot 等无关账号登入的信息,因此,我利用 # grep 取出非空白行,以及去除上述关键词那几行,再计算行数
tee双向重导向
tee 可以让 standard output 转存一份到文件内并将同样的数据继续送到屏幕去处理! 这样除了可以 让我们同时分析一份数据并记录下来之外,还可以作为处理一份数据的中间暂存盘记录之用。
tee [-a] file
-a 以append的方式,将数据加入file中
tr 可以用来删除一段讯息当中的文字,或者是进行文字讯息的替换
tr [-ds] SET1 ...
-d 删除讯息中SET1的字符串
-s 取代掉重复的字符
# 将last的输出中小写变大写
last | tr '[a-z]' '[A-Z]'
#经常用来替换文件中奇怪的符号。
col
col [-xb]
-x: 将tab键转换成对等的空格键
#利用 cat -A 显示出所有特殊按键,最后以 col 将 [tab] 转成空白
cat /etc/man_db.conf | col -x | cat -A | more
join 处理相关联数据的好帮手
join [-ti12] file1 file2
-t join 默认以空格符分隔数据,并且比对『第一个字段』的数据,
如果两个文件相同,则将两笔数据联成一行,且第一个字段放在第一个
-i 忽略大小写
-1 第一个文件要用哪个字段
-2 第二个文件要用哪个字段
join -t ':' -1 4 /etc/passwd -2 3 /etc/group | head -n 3
# 使用join之前需要实现排序处理哦
paste 直接贴在一起,以[tab]键隔开
paste [-d] file1 file2
-d 默认的分隔符是tab 可指定
- 如果file部分写成-,表示来自 standard input 的资料的意思
expand 将tab转成空格
expand [-t] file
-t 后面可以接数字。一般来说,一个 tab 按键可以用 8 个空格键取代。
我们也可以自行定义一个 [tab] 按键代表多少个字符呢
#unexpand 将空格转成tab
split
split [-bl] file PREFIX
-b :后面可接欲分区成的文件大小,可加单位,例如 b, k, m 等;
-l :以行数来进行分区。
PREFIX :代表前导符的意思,可作为分区文件的前导文字。
# 切割文件
cd /tmp; split -b 300k /etc/services services
# 复原为一个文件
cat services* >> servicesback
xargs
xargs [-0epn] command
-0 :如果输入的 stdin 含有特殊字符,例如 `, \, 空格键等等字符时,这个 -0 参数
可以将他还原成一般字符。这个参数可以用于特殊状态喔!
-e :这个是 EOF (end of file) 的意思。后面可以接一个字符串,当 xargs 分析到这个字符串时,
就会停止继续工作!
-p :在执行每个指令的 argument 时,都会询问使用者的意思;
-n :后面接次数,每次 command 指令执行时,要使用几个参数的意思。 当 xargs 后面没有接任何的指令时,默认是以 echo 来进行输出喔!
# 很多指令其实并不支持管 线命令,因此我们可以透过 xargs 来提供该指令引用 standard input 之用
关于减号 - 的用途
tar -cvf - /home | tar -xvf - -C /tmp/homeback
# 我将 /home 里面的文件给他打包,但打包的数据不是纪录到文件,而是传送到 stdout; 经过管线后,将 tar -cvf - /home 传送给后面的 tar -xvf - 』。后面的这个 - 则是取用前 一个指令的 stdout, 因此,我们就不需要使用 filename 了