Linux学习日记——BASH

一、认识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.

你可能感兴趣的:(Linux学习日记——BASH)