Linux 认识与学习bash

Linux 认识与学习bash

shell简介

  • 用户 -> Shell -> 内核 -> 硬件
  • 我们必须通过Shell将我们输入的命令与内核通信,好让内核可以控制硬件来正确无误地工作。
  • shell的功能只是提供用户操作系统的一个接口,因此shell需要可以调用其他软件才好。
  • bahs 和 shell的关系:bash是shell的一种。是现在Linux发行版本中的标准shell
  • 每当一个用户登录的时候,就会有一个shell来让我工作

shell 的种类

  • 第一个shell是由Steven Bourne发展出来的。称为sh
  • Bill Joy设计依附于BSD版的UNIX系统的shell,由于语法类似与C语言,所以称为 C shell,简称csh
  • bash是Bourne shell的增强版本

在/etc/shells下可以看到本机可以使用的shell
Linux 认识与学习bash_第1张图片

shell的作用

  • 系统管理。shell和shell scripts对于系统管理很重要
  • 远程管理。命令行界面比较快。

命令别名设置

  • 查看命令别名:alias
    Linux 认识与学习bash_第2张图片
  • 设置命令别名:alias lm=‘ls -al’
  • 取消设置命令别名:unalias 命令别名
  • 在注销bash之后,就会自动取消别名的设置

bash的内置命令:type

Linux 认识与学习bash_第3张图片
可以通过type命令来查看命令是否是bash内置的

shell的变量功能

什么是变量

  • 变量就是以一组文字或符号等,来替代一些设置或者一串保留的数据。
  • 环境变量:系统需要一些变量来提供它的数据的访问。为了区别自定义变量,这部分变量常是大写字符来表示。

变量的显示和设置:echo、unset

  • 设置变量:myname=XXX (直接用等号连接)(注意不要有多余的空格符)
  • 显示变量:echo m y n a m e ( 注 意 加 上 myname (注意加上 myname
  • 取消变量:unset myname
  • 如果有特殊字符,如$等。用双引号或者单引号把整个变量结合起来。
  • 变量连接:myname="$myname"more_content(直接在后面添加,但是注意格式)
  • 设置变量允许其他子进程执行:export myname(因为子进程仅会继承父进程的环境变量,子进程不会继承父进程的自定义变量)

单引号和双引号的区别

双引号仍然可以保有变量的内容,但单引号内仅能是一般字符,而不会有特殊符号

name=abc
echo $name
显示:abc

myname="$name is me"
echo $myname
显示:abc is me

myname='$name is me'
echo $myname
显示:$name is me

特殊符号“`”的使用

使用“`…`”扩起来的内容会优先执行。例如

cd /lib/modules/`unmae -r`/kernel

便会先执行unmae -r的内容。然后再处理整个数据

查看所有环境变量

env

其中:

  • HOME:代表用户的主文件夹
  • SHELL:指出我们目前环境使用的是哪个SHELL程序。Linux默认使用/bin/bash
  • MAIL:当我们使用mail这个命令在收信时系统会去读取的邮件信箱文件
  • PATH:执行文件查找的路径,目录与目录中间以冒号分割。

查看所有变量

set

其中:

  • PS1表示提示符的设置。我们可以通过修改PS1的内容,来修改提示符
提示符:(命令行前面的显示)
[budding@budding ~]

具体修改方法可以查看man

  • : : 本身也是一个变量。代表目前这个shell的线程代号。

  • ?:上个执行命令的回传码

变量键盘读取和声明

  • 读取
read [-pt] variable

-p:后面可以接提示符
-t:后面可以接等待的“秒数”

示例:
Linux 认识与学习bash_第4张图片

  • 声明
declare [-aixr] variable
- 后面什么都没有加,用法和set一样
-a:将后面的变量定义为数组类型
-i:将后面的变量定义为整数数字类型(目前最高精度是整数)
-x:用法和export一样,将后面的变量设置为环境变量
-r:设置变量为readonly。不可被修改

示例
Linux 认识与学习bash_第5张图片

个人觉得这个数组的声明在这里没有很大的作用,和普通变量类型。可能在shell script才会比较有用吧。

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

列出所有的限制额度

ulimit -a 

Linux 认识与学习bash_第6张图片

可以根据提示进行设置。例如设置最大的文件容量。可以使用下面的命令:

limit -f 10240

复原ulimit的设置最简单的方法就是注销之后再登录。

历史记录

使用命令

history [n] 查看最近n条命令
history [-c] 将目前shell中的所有history内容全部清除
  • 当我们以bash登录Linux主机之后,系统会主动由文件夹的~/.bash_history读取以前曾经下过的命令。~/.bash_history会记录的条数和HISTSIZE这个变量设置值有关。
  • 历史命令会在我注销的时候,将最近的HISTSIZE条记录到我的记录文件当中。
!number:执行第number条命令
!command:执行最近以command开头的命令
!!:执行最近的命令。

bash的命令查找顺序

  1. 以相对/绝对路径执行的命令。例如./ls
  2. 由alias找到该命令来执行
  3. 由bash内置的builtin命令来执行
  4. 通过$PATH这个变量的顺序找到的第一个命令来执行

数据流重定向

重定向就是将原本要出现在屏幕上的数据传输到其他的地方。

标准输入:代码为0,使用< 或者<<
标准输出:代码为1,使用> 或者>>
标准错误输出:代码为2,使用2> 或者2>>(注意区分标准输出,多了个数字2)

> 和>>的区别:>会直接重新覆盖原有内容。而>>会在最后追加

示例:

标准输出:
ll / > ~/rootfile

标准错误输出:
find /home -name .bashrc 2> errorlist

分别输出到不同文件
find /home -name .bashrc > list_right 2>errorlisr

对于不想处理的错误输出,可以扔到垃圾桶黑洞中:/dev/null

多条命令的执行

cmd; cmd;

cmd1 && cmd2
- cmd1执行完毕且正确执行,则开始执行cmd2
- cmd1执行错误,则cmd2不执行

cmd1 || cmd2
- cmd1执行正确,则cmd2不执行
- cmd1执行错误,则cmd2执行

管道命令

  • 管道命令使用的是“|”这个界定符号。
  • Command1(产生stdout,对于Command2来说的stdin)-> Command2
  • 在每个管道后面接的第一个数据必定是“命令”,而且这个命令必须要能够接受standard input 的数据才行。
  • 管道命令仅会处理standard output,对于standard error output会予以忽略。
  • 管道命令必须要能够接受来自前一个命令的数据成为standard input继续处理才行。

选取命令:cut、grep

  • cut:
    介绍:这个命令可以将一段信息的某一端“切”出来,处理的信息以“行”为单位。
    作用:以某些字符当作切割的参数,然后来将数据加以切割
cut -d '分割字符' -f fields

cut -c 字符范围

-d:后面接分割字符,与-f一起使用(不能单独使用)
-f:依据-d的分割字符将一段信息切割成为数段,用-f取出第几段的意思
-c:以字符的单位取出固定字符区间

示例:

//以“:”为分割,取出第3和第5条
echo $PATH | cut -d ':' -f 3,5
  • grep
    介绍:分析一行信息,若当中有我们所需要的信息,就将该行拿出来。
    作用:解析一行文字,取得关键字,若该行有存在关键字,就会整行列出来
grep [-acinv] '查找字符串' filename
-a:将binary文件以text文件的方式查找数据
-c:计算找到“查找字符串”的次数
-i:忽略大小写的不同
-n:顺便输出行号
-v:反向选择。显示没有找到“查找字符串”内容的那一行

示例:

last | grep 'root'

Linux 认识与学习bash_第7张图片

排序命令:sort、wc、uniq

  • sort
    介绍:可以依据不同的数据类型来排序
sort [-fbMnrtuk] [file or stdin]
-f:忽略大小写的差异
-b:忽略最前面的空格符部分
-n:使用“纯数字”来进行排序(默认是以文字类型来排序)
-r:反向排序
-u:就是uniq,相同的数据中,仅出现一行代表
-k:以那个区间来进行排序的意思

示例:

cat /etc/passwd | sort
  • uniq
    介绍:将重复的数据仅列出一个显示
last | cut -d ' ' -f1 | sort | uniq
  • wc
    介绍:计算输出的信息的整体数据
wc [-lwm]
-l:仅列出行
-w:仅列出多少字
-m:多少字符

Linux 认识与学习bash_第8张图片

双向重定向:tee

介绍:tee会同时将数据流送与文件和屏幕。(相当于同时流两份内容到不同地方,一份去文件,一份流向屏幕)

tee [-a] file
-a:以累加的方式

示例

last | tee last.list | cut -d ' ' -f1

字符转换命令

  • tr
tr [-ds] SET1
-d:删除信息当中SET1这个字符串
-s:替换掉重复的字符

示例

所有小写变大写
last | tr '[a-z]' '[A-Z]'
  • col
    用途:col经常用于将man page转存为纯文本以方便查阅的功能。如示例所示:
col [-xb]
-x:将tab键转换成对等的空格键

示例:

可以使用cat -A file 显示出所有特殊键
man col > /root/col.man
  • paste
    用途:将两个文件的对应每一行,中间以tab键隔开拼成一行
paste [-d] file1 file2
-d:后面可以接分割字符,默认是以tab来分割的
  • expand
    将tab按键替换成空格键
expand [-t] file
-t:后面可以接数字,一般来说,一个tab按键可以用8哥空格键替换

-unexpand
将空白转成tab的命令

切割命令:split

split [-bl] file PREFIX
-b:后面可以接欲切割成的文件的大小,可加单位。例如b,k,m等
-l:以行数来进行切割
PREFIX:前导符,可以作为切割文件的前导文字

示例:

split -b 300k /etc/termcap termcap
会自动生成termcapaa、termcapab、termcapac等

合并:
cat termcap* >> termcapback

关于减号-的用途

可以用来代替命令间的stdin和stdout
示例:

tar -cvf - /home | tar -xvf -

前面一个’-‘代表tar -cvf产生的stdout
后面一个’-'代表取前面一个命令的stdout

你可能感兴趣的:(操作系统,Linux)