一、认识BASH
BASH是目前Linux系统应用最多的shell,也是大多数Linux系统默认的shell.
shell是操作系统的接口,它的地位如下图:
使用shell的几个好处:
命令行界面的shell:大家都一样。几乎各家distribution使用的bash都是一样的。这样你可以随意转换不同的distribution。
远程管理:命令行较快。速度快而且不太会出现短线或者信息外流的问题。
bash是GNU计划中重要的计划之一,目前也是distributions的标准shell。bash的优点有:
命令记忆功能:(history)在命令行中使用上下箭头键就可以找到前/后一个输入的命令;
命令与文件补全功能:[Tab]键补全。[Tab]接在一串命令的第一个字后面,则为命令补全;[Tab]接在一串命令的第二个字以后时,为文件补齐。在bash shell下不妨多按几次[Tab]键。
命令别名设置。 alias lm = 'ls -al'
程序脚本
通配符 * 的使用.
二、shell的变量功能
变量的取用 echo
变量设定规则
1. 变量与内容以一个等号 [=] 来连接,如下所示:
[myname=VBird]
2. 等号两边不能直接空格符,如下所示为错误:
[myname = VBird] 或 [myname=VBird Tsai]
3. 变量名称只能是英文字母与数字,但是开头字符不能是数字,如下为错误:
[2myname=VBird]
4. 变量内容若有空格符可使用双引号["]或单引号[']将变量内容结合起来,但
双引号内的特殊字符如$等,可以保有原来的特性,如下所示:
[var="lang is $LANG"] 则 [echo $var] 可得 [lang is zh_TW.UTF-8]
单引号内的特殊字符则仅为一般字符(纯文本),如下所示:
[var='lang is $LANG'] 则 [echo $var] 可得 [lang is $LANG]
5. 可用跳脱字符[ \ ]将特殊符号(如 [Enter],$,\,空格符,'等)变成一般字符,如:
[myname=VBird\ Tsai]
6. 在一串指令的执行中,还需要籍由其他额外的指令提供的信息时,可以使用反单引号[`指令`]或[$(指令)]。
特别注意,那个 ` 是键盘上方的数字键 1 左边那个按键,而不是单引号!例如想要取得核心版本的设定:
[version=$(uname -r)] 再 [echo $version] 可得 [3.10.0-229.e17.x86_64]
7. 若该变量为扩增变量内容时,则可用 “$变量名称” 或 ${变量} 累加内容,如下所示:
[PATH="$PATH":/home/bin] 或 [PATH=${PATH}:/home/bin]
8. 若该变量需要在其他子程序执行,则需要以 export 来使变量变成环境变量:
[export PATH]
9. 通常大写字符为系统默认变量,自行设定变量可以使用小写字符,方便判断(纯粹依照使用者兴趣与嗜好);
10.取消变量的方法为使用 unset : [uset 变量名称] 例如取消 myname 的设定:
[unset myname]
环境变量
set:显示(设置)shell变量 包括的私有变量以及用户变量,不同类的shell有不同的私有变量 bash,ksh,csh每中shell私有变量都不一样
env:显示(设置)用户变量变量
export:显示(设置)当前导出成用户变量的shell变量。
shell(这里指bash)的初始化过程是这样的:
1.bash检查文件/etc/profile是否存在
2.如果存在,bash就读取该文件,否则,跳过
3.bash检查主目录下的文件.bash_profile是否存在。
4.如果存在,bash就读取該文件,否则,跳过
5.bash检查主目录下的.bash_login是否存在。
6.如果存在,bash就读取该文件,否则,跳过
7.bash检查主目录下的文件.profile是否存在
8.如果存在,bash就读取该文件,否则,跳过。
这些步骤都执行完后,就出现提示符了,ksh默认提示符是$.
所以可以通过更改相关文件里的配置设置你的环境变量.
变量读取、数组、宣告
变量内容的删除与替换
三、bash shell操作环境
bash shell对指令的搜寻顺序:
1.以相对/绝对路径运行命令,例如『 /bin/ls 』或『 ./ls 』;
2.由 alias 找到该命令来运行;
3.由 bash 内建的 (builtin) 命令来运行;
4.透过 $PATH 这个变量的顺序搜寻到的第一个命令来运行。
通过type命令查看命令搜寻顺序,例如:type -a vi
. bash 也有进站画面与欢迎讯息.在终端机接口 (tty1 ~ tty6) 登入的时候,会有几行提示的字符串,那就是进站画面. 那个字符串写在 /etc/issue 里面.
如果想要让使用者登入后取得一些讯息,例如想要让大家都知道的讯息, 那么可以将讯息加入 /etc/motd里面去!例如:当登入后,告诉登入者, 系统将会在某个固定时间进行维护工作,可以这样做:
linux-peej:~ # vi /etc/motd
Hello everyone, Our server will be maintained at 2015/06/28 0:00 ~ 24:00. Please don't login server at that time.
那么当你的使用者(包括所有的一般账号与 root)登入主机后,就会显示这样的讯息出来:
Last login: Sat Jun 28 11:20:16 2015 from 192.168.137.1
Hello everyone, Our server will be maintained at 2009/02/28 0:00 ~ 24:00. Please don't login server at that time.
终端机的环境设定
四、数据流重导向
将命令执行后的数据输出到指定地方
/dev/null 是可以当垃圾桶用的文件,可以将不需要的错误输出重定向到此文件,这些信息将会自动清除.
如果将正确和错误信息都写入文件,需要特殊写法:
命令执行判断依据
&&
cmd1 && cmd2
若cmd1执行完毕且正确执行($?=0),则开始执行cmd2
若cmd2执行完毕且为错误($? !=0),则cmd2不执行
||
cmd1 || cmd2
若cmd1执行完毕且正确执行($?=0),则cmd2不执行
若cmd2执行完毕且为错误($? !=0),则开始执行cmd2
分号;
cmd;cmd
多条命令顺序执行,执行顺序是从左到右的顺序。
()运算符:
为了在当前shell中执行一组命令,可以用命令分隔符(即",")隔开每一个命令,并把所有的命令用圆括号()括起来。
{}运算符:
如果使用{}来代替(),那么相应的命令将在子shell而不是当前shell中作为一个整体被执行,只有在{}中所有命令的输出作为一个整体被重定向时,其中的命令才被放到子shell中执行,否则在当前shell执行。
command1 && command2 || command3
如果command1执行正确,则执行command2
如果command1执行为错误,则执行command3
五、管线命令
撷取命令
排序命令
tee(双向重定向)
管道符或者“>”操作符都是单向的数据流,为了在数据流处理的国中将某段信息保存到文件,同时希望这个数据流继续输出到后续的命令,那么tee就是为了完成这样的工作情景。
Linux中常用的字符转换命令有:tr,col,join,paste,expand。
(1)tr:可以用来删除一段信息当中的文字,或者是进行文字信息的转换。
a)tr 'SET1' 'SET2' tr的默认操作是替换, 作用是把标准输入中含有的SET1中的字符依次换成SET2中对应的字符。
例如:echo "Hello, Kevin" | tr 'a-z' 'A-Z'
输出结果是:HELLO,KEVIN
例如:echo "Hello, Kevin" | tr 'he' 'XX'
输出结果是:HXllo, KXvin
b) tr -d SET1 当tr带有-d参数的时候表示删除标准输入中所有在SET1 中出现的字符。
例如:echo “Hello, Kevin” | tr -d 'a-z'
输出结果是:H, K上述语句的作用就是删除了标准输入中的所有小写字母。
c) tr -s SET1 当tr带有-s参数的时候表示替换掉标准输入中在SET1中重复出现的字符,只保留一个。
例如: echo "Hello, Kevin" | tr -s 'a-z'
输出结果是:Helo, Kevin 结果中删除重复出现的l只保留了一个。
(2) col:在许多UNIX说明文件里,都有RLF控制字符。当我们运用shell特殊字符">"和">>",把说明文件的内容输出成纯文本文件时,控制字符会变成乱码,col指令则能有效滤除这些控制字符。
a)col -b过滤掉所有的控制字符,包括RLF和HRLF。
b)col -x 将tab建换成对等的空格键
(3)join: 它处理两个文件之间的数据,主要是将两个文件中有相同数据的行合并在一起。要注意的是在使用join之前,索要处理的两个文件应当是经过排序的,否则有些对比的项目会被略过。
-t:分段的分隔符。 join默认以空格符分隔数据,并且对比“第一个字段”的数据,如果两个文件相同,则将两条数据连城一行,且第一个字段放在第一个。
-i: 忽略大小写的差异。
-1: 数字1后面代表的是第一个文件用哪个字段来分析
-2:数字2后面代表的是第二个文件用哪个字段来分析
例如:test1中有如下数据:
Kevin 100
Luna 100
Max 100
John 100
test2中有如下数据:
Luna 10
John 20
Max 30
Kevin 40
分别将test1和test2排序并保存在test1_s和test2_s中,然后用join对两个文件进行处理:join test1 test2 获得以下结果:
John 120
Kevin 140
Luna 110
Max 130
(4)paste: 直接将两个文件中具有相同数据的行贴在一起,且中间以tab建隔开。
-d: 后面可以接分隔符,默认是以tab来分隔的
- :如果file部分写成-,表示数据来自stdin
还是按照上面的例子对于排序后的test1_s和test2_s用paste进行处理 paste -d ' ' test1_s test2_s将获得以下结果:
John 100 John 20
Kevin 100 Kevin 40
Luna 100 Luna 10
Max 100 Max 30
(5)expand: 将tab转换成空格键。
-t : 后面可以接数字,自定义一个tab按键代表多少个字符。
参数代换 xargs
减号"-"用途
替代stdin和stdout.
网友评论