linux学习(六) 鸟叔第十章:学习和使用BASH

                根据jyy的推荐之前一直是使用的fish这个Shell,但是由于很多命令和BASH有出入,涉及到本文最主要的有:

  • fish的变量命名是由 set 变量 ‘ ’ 
  • fish的命令提示行是由脚本写的,虽然能用不同的颜色进行提示,但是也造成了很难对其更改(目前所学的知识不足以更改),而BASH可以通过PS1这个变量很轻易地做出改变 

介于这些原因主要还是总结BASH的内容,学好BASH再去摸索fish也不失为一种学习方法。

目录

 1 bash的操作环境

1.1 命令查找顺序

1.2 登录欢迎信息:/etc/issue  /etc/motd

1.3 环境配置文件

1.3.1 相关的配置文件:/etc/profile  ~/.bash_profile ~/.bashrc等

 1.3.2 配置相关的命令

1.3.2.1 source:读入环境配置文件

1.3.2.2 环境终端设置:ssty、set

2 变量

2.1 变量的设置规则

2.2 变量的有效范围:export

2.3 变量设置的操作

2.3.1 观察环境变量:env

2.3.2 观察所有变量(环境变量和用户自定义的变量):set

2.3.3 显示出变量:echo

2.3.4 变量内容累加: ${变量} 累加内容

2.3.5 取消变量设置:unset 

2.3.6 语系变量:locale

2.4 变量键盘读取、数组与声明

2.4.1 读取键盘的输入变量:read

2.4.2 声明变量类型:declare、typeset

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

2.5 变量内容删除取代与替换

2.5.1 删除:# ## % %%

2.5.2 替换:/ / 或者 //   /

2.5.3 变量的测试与内容替换:- + : = ?

3 变量别名与历史命令

3.1 命令别名设置:alias、unalias

 3.2 历史命令:history

4 通配符与特殊符号

5 数据流重定向

5.1 标准输出:代码为1 用> >> ;标准错误输出:代码为2 用2> 2>>

5.2 标准输入:代码为0 用< <<

5.3 命令的与和或:&& ||

6 管道命令 |

         6.1 选取命令:cut、grep

6.2 排序命令:sort、wc、uniq

6.3 双向重定向:tee

6.4 字符转换命令tr col join paste expand

6.5 划分命令:split

6.6 参数代换:xargs

6.7 【-】的作用


 1 bash的操作环境

1.1 命令查找顺序

命令的查找顺序如下:

  1. 以相对/绝对路径执行命令
  2. 查找alias的命令别名
  3. bash的内置命令
  4. $PATH变量顺序查找到第一个命令来执行

1.2 登录欢迎信息:/etc/issue  /etc/motd

         /etc/issue保存了bash登录的提示字符串,会有反斜杠来作为变量来使用。

        /etc/motd的内容是用户登录后都会见到的信息。

1.3 环境配置文件

1.3.1 相关的配置文件:/etc/profile  ~/.bash_profile ~/.bashrc等

        login shell和non-login shell区别是前者需要完整的登录流程而后者只需要登录linux可以在终端不需要重复登录。

         由图所示,login shell访问/etc/profile(系统整体设置)、~./bash_profile(用户个人设置)两个文件;而non-login shell只会访问~./bashrc。/etc/bashrc还有用户自己定义的umask和PS1提示符等。

 1.3.2 配置相关的命令

1.3.2.1 source:读入环境配置文件

source 配置文件名

可以不需要重新登录,读取配置文件并且设置环境,能够在多个不同环境之间切换更加方便。

1.3.2.2 环境终端设置:ssty、set

       linux已经为我们配置好了最好的用户环境,例如删除字符用退格(^?)来实现,打断用ctrl+c实现等,但是我们也可以用ssty来自定义这些设置。

        set:①显示变量②设置终端值③设置命令输出输入环境

2 变量

        变量的使用是需要用$开头,$作为变量替换值将后面所接的变量的值转换出来。

        linux重要的一些配置都是变量形式,例如执行文件查找目录$PATH。

2.1 变量的设置规则

  • 变量名称只能是英文字母和数字且开头不能是数字
  • 变量的设置用= ,且=两边不能有空格: var=vbird
  • 双引号内的特殊字符如$等可以保持原有的特性。
  • 单引号内特殊字符仅仅是一般字符(纯文本)
  • 转义字符可以将特殊字符变成一般字符

2.2 变量的有效范围:export

       和C一样:

  • 环境变量=全局变量
  • 自定义变量=局部变量

        如果在一个shell中加载另一个shell即启动子进程,是不可以访问到父进程的局部变量的,这时可以使用export来将局部变量变成全局变量。

2.3 变量设置的操作

2.3.1 观察环境变量:env

        通过env可以观察到全部的环境变量与其内容。

  • HOME:用户根目录
  • SHELL:所使用的SHELL程序
  • HISTSIZE:历史命令的条数
  • PATH:执行文件查找目录
  • LANG:语系数据
  • RANDOM:随机数(0-32767)

2.3.2 观察所有变量(环境变量和用户自定义的变量):set

  • PS1:提示字符设置。
  • $:本shell的PID。可以用echo $$来显示出PID号码
  • ?:上一个命令的返回值。echo $?来显示,如果上一条指令成果则会返回0,不成功则非0
  • OSTYPE,HOSTTYPE,MACHTYPE:主机硬件和内核等级

2.3.3 显示出变量:echo

echo 变量名

2.3.4 变量内容累加: ${变量} 累加内容

        这里其实有三种方式都可以进行累加①变量=$变量:累加内容②变量=“$变量”:累加内容③变量=${变量}:累加内容。但是我们主要记住第三种,这种用的最普遍,值得注意的是冒号也是没必要的,只有第一种需要加冒号作为分割,后两种都有分割所以也可以不需要冒号了。

2.3.5 取消变量设置:unset 

2.3.6 语系变量:locale

        直接输入locale会显示当前的语言环境,主要是LANG或者LC_ALL,只要这两个设置了,其他没有设置的语系变量都会被这两个变量所替代。locale -a可以显示所有支持的语系环境。

        想要变更语系:可以用export将LANG和LC_ALL变成全局变量。例如export LANG=C;export LC_ALL=C这样将整个语系换成C。

2.4 变量键盘读取、数组与声明

2.4.1 读取键盘的输入变量:read

        -p接提示字符但是提示字符似乎不可以转译字符;-t 限制时间。

2.4.2 声明变量类型:declare、typeset

declare [] 变量
选项与参数:
-a:变量定义成数组
-i:变量定义成整数
-x:用法等同于export
-r:变量设置成不可更改内容也不嫩unset
-p:单独列出变量类型

将-换成+就可以进行【取消】

        变量类型默认是字符串,所以直接输入变量=1+1会被当成字符串,需要加入-i后才会有变量=2,而且bash中的数值运算直到整数。

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

        ulimit可以限制用户的某些系统资源包括可以开启的文件数量,可以使用的CPU时间,内存总量等。

2.5 变量内容删除取代与替换

2.5.1 删除:# ## % %%

        #或者##、%或者%%后面接需要删除的关键字。

  • #:从前往后找替换符合的【最短】那一个
  • ##:从前往后找替换符合的【最长】那一个
  • %:从后往前找替换符合(从前往后依次匹配关键字)的【最短】的那一个
  • %%:从后往前找替换符合(从前往后依次匹配关键字)的【最长】的那一个
${变量#关键字}

2.5.2 替换:/ / 或者 //   /

  • ${变量/旧字符串/新字符串}:只替换第一个符合的旧字符串
  • ${变量//旧字符串/新字符串}:替换所有符合的旧字符串

2.5.3 变量的测试与内容替换:- + : = ?

        注意到【-】后面接关键词,str没有设置和和空字符串行为是不同的,但是再加上【:】后就一致了。

3 变量别名与历史命令

3.1 命令别名设置:alias、unalias

alias 别名=‘命令’

 3.2 历史命令:history

history [n]         
列出最近n条命令
history [-craw] 文件名

值得指出的是!也可以用来执行命令

!number:执行第几条命令
!command:向前查找执行以command开头的第一个命令
!!:执行上一条命令

4 通配符与特殊符号

常用通配符
*【0个到无穷多个】任意字符
?【一定有一个】任意字符                 /??? :根目录下的三个字的文件名
[ ]【一定有一个在括号内的】字符      [abcd]:一定有一个字符是abcd中的一个
[ - ]【在编码顺序内的所有字符】          [0-9]:一定有一个字符是0到9之间的一个
[ ^ ]【反向选择字符】                            [^abc]:一定有一个字符不是abc中的一个

特殊符号
|管道
连续命令执行分隔符
$使用变量前导符
>  >>数据流重定向:输出定向分别是【替换】【累加】
< <<数据流重定向:输入定向
` `(是~那个键)两个【`】中间是先执行的命令,也可以$(  )
&将命令变成后台任务
( )中间为子shell起始与结束
{  }中间为命令区块的组合
#注释符号

5 数据流重定向

5.1 标准输出:代码为1 用> >> ;标准错误输出:代码为2 用2> 2>>

  • 1> :以覆盖的方式将【正确】的数据输出到指定的文件或者设备上
  • 1>>:以追加的方式将【正确】的数据输出到指定的文件或者设备上
  • 2>: 以覆盖的方式将【错误】的数据输出到指定的文件或者设备上
  • 2>>: 以追加的方式将【错误】的数据输出到指定的文件或者设备上

如果想要同时将两股数据写入同一个文件可以用 2>&1或者1>&2。 注意 >文件1 2>文件1 ,这种方式是错误的,会造成两股数据交叉写入文件1。

5.2 标准输入:代码为0 用< <<

        简单来说标准输入就是将原本需要键盘输入的数据,改由文件内容来替换。<代表以EOF(ctrl +d)作为输入的结束字符,<<后面接"字符串"代表结束的输入字符不需要输入ctrl+d。

5.3 命令的与和或:&& ||

        几个命令之间可以用;来分割,也可以在有关系的命令之间也可以用与和或,其用法和执行情况和C一致。

6 管道命令 |

        管道命令只能处理正确的信息,也就是说标准错误会被忽略。

6.1 选取命令:cut、grep

        选取信息都是以行作为基本单位来分析的。

  • cut:将一行信息中取出某部分是我们想要的
  • grep:分析一行信息,若当中有我们想要的取出一行
cut -d'分隔字符' -f 数字   <==用于有特定分隔符
cut -c字符区间             <==用于排列整齐的信息
-d:后面接分割符
-f:后面接数字表示第几个分割区间 若多个类似:1,2取出1和2区间
-c:以字符为单位取出固定字符区间 可以用n1-n2,若没有n2表示到结尾
grep [] '查找字符' 文件名
-a:以二进制查找
-c:计算找到字符的次数
-n:顺便输出行号
-v:反向选择,显示出没有查找字符的行

6.2 排序命令:sort、wc、uniq

  • sort:就是简单的排序命令
  • uniq:可以将连续重复的数据仅列出一个显示 uniq -c可以进行计数
  • wc:可以计算出输出信息的行数、字数、字符数

6.3 双向重定向:tee

        数据流分别送到文件与屏幕

tee [] file

6.4 字符转换命令tr col join paste expand

  • tr:用来删除(-d)或者替换(-s)一段信息中的文字
  • col:tab转换成对应数量的空格
  • join:将两个文件中有相同数据的一行加在一起(可以用-t12等参数指定哪个栏位来比较)
  • paste:将两文件相同行数数据加在一起,中间tab隔开
  • expand:tab转换成空格

6.5 划分命令:split

        可以将大文件按照单位(-b -k -m)或者按照行数(-l)划分成多个小文件

6.6 参数代换:xargs

        很多不支持管道的命令用xargs来提供改命令的标准输入。例如由于id这个命令只支持一个参数,如果直接用管道命令会将太多的参数传入,这时我们可以用xargs -n 1 id 来给id每次只传一个参数,这样就能使用id这个命令了。这是个很好的小玩意儿。

6.7 【-】的作用

        可以用来代替需要输入/输出文件的地方传入标准输入/标准输出。所以某些需要用到文件名的地方,可以利用-来代替stdin与stdout。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值