十、认识与学习BASH

1、认识BASH这个shell

1.1、硬件、核心与shell

  • 通过shell将我们输入的指令与Kernel沟通,让Kernel可以控制硬件来正确无误的工作。
  • 只要能够操作应用程序的接口都能够成为壳程序。
    狭义的壳程序指的是指令列方面的软件,如bash,广义的壳程序则包括图形接口的软件,因为图形接口也能够操作各种应用程序来呼叫核心工作。

1.2、学习文字接口shell的必要性

  • 几乎各家的distributions使用的bash都一样;
  • 文字接口速度快;
  • 想成为系统管理员,shell与shell scripts必须要学;

1.3、系统的合法shell与/etc/shells功能

  • cat /etc/shells:可以查看系统有哪些可用的shells;
  • cat /etc/passwd:登录时使用者获取的shell可以通过这个命令查看
  • /bin/bash是Linux预设的shell,目前也是Linux distribution的标准shell,bash兼容sh;

1.4、Bash shell的功能

  • 命令编修能力
    在家目录里的.bash_history里面记录了你之前使用过的命令
  • 命令与档案的不全功能
    Tab接在一窜指令的第一个字的后面,则为命令补全;
    Tab接在一窜指令的第二个字以后,则为档案补全;
  • 命令别名设定功能:alias
    例如:alias lm='ls -al'
    直接输入alias可以查看目前的别名
  • 程序化脚本:shell scripts
  • 通配符
    shell支持许多的通配符来帮助用户查询与下达指令;
    例如:ls -l /usr/bin/X*

1.5、Bash shell的内建命令:type

为了方便shell的操作,bash已经内建了很多指令,例如cd等
可以利用type来判断该指令是内建指令还是外部指令;
type 【-tpa】name

1.6、指令的下达

反斜杠“\”可用于跳脱 如果[Enter]

2、Shell的变量功能

2.1、什么是变量

变量就是某个一特定字符串代表不固定的内容。

  • 数据的可变性和方便性;
  • 影像bash环境操作的变量
  • 脚本程序设计(shell script)的帮手

2.2、变量的取用与设定:echo,变量设定规则,unset

变量输出:echo PATH 变量设定规则 1、变量与变量内容以一个=来链接; 2、等号两边不能直接接空格符 3、变量名只能是英文字母与数字,但不能是数字开头; 4、变量内容若有空格符可使用双引号“”或单引号''将变量内容结合起来,但双引号内的特殊字符如等,可以保留原本的特性;单引号内的特殊字符则仅为一般字符(纯文本);
5、可用跳脱字符\将特殊符号如回车键、,\,空格符等变成一般字符; 6、在一窜指令中,还需要藉由其他的指令提供的信息,可以使用反单引号`或(指令);
7、若该变量为扩增变量内容,则可用“变量名称”或{变量}累加内容,如PATH="$PATH":/home/bin
8、若该变量需要其他子程序执行,则需要使用export来使变量变为环境变量;
9、通常大写字符为系统默认变量,自行设定变量可以使用小写字符;
10、取消变量的使用方法使用unset:变量名称,如unset myname

2.3、环境变量的功能:env与常见环境变量说明,set,export

  • 用env观察环境变量与常见环境变量说明
    命令:evn
    常见环境变量:
    1、HOME:代表用户的家目录
    2、SHELL:目前环境使用的SHELL,预设使用/bin/bash
    3、HISTSIZE:记录我们曾经下达过的指令的数量
    4、MAIL:邮件信箱档案
    5、PATH:执行文件搜索路径
    6、LANG:语系数据
    7、RANDOM:随机数变零
  • 用set观察所有变量(含环境变量和自定义变量)
    命令:set
    比较重要的变量有:
    1、PS1:就是我们得命令提示符
    1)\d:可显示出【星期 月 日】的日期格式
    2)\H:完整的主机名
    3)\h:主机名第一个小数点之前的名字
    4)\t:显示时间HH:MM:SS
    5)\T:显示时间,为12小时格式的HH:MM:SS
    6)\A:显示时间,为24小时格式的HH:MM
    7)@:显示时间,为12小时的am/pm
    8)\u:目前使用者的账号名称:如root
    9)\v:BASH的版本信息
    10)\w:完整的工作目录名称,由根目录写起的目录名称
    11)\W:利用basename函数取得的工作目录名称
    12)#:下达的第几个指令
    13)$:提示字符,如果是root时,提示字符为#,否则就是2、:关于本shell的PID
    代表的是目前这个shell的线程代号,亦即所谓的PID
    echo $$
    3、?:关于上个执行指令的回传值
    上一个回传指令所传回的值。当我们执行某些指令时,这些指令都会回传一个执行后的代码,一般来说,如果成功的执行该指令,则会回传一个0值,如果执行过程发生错误,就会回传错误代码;
    4、自定义变量转成环境变量
    子程序会继承父程序的环境变量,但是不会继承父程序的自定义变量
    如果想将父程序的自定义变量在子程序使用,使用export 变量名称

2.4、影响显示结果的语系变量(local)

查询Linux支持的语系:locale -a
l修订编码:locale

2.5、变量的有效范围

全局变量=环境变量
自定义变量=局部变量
内存配置关系:
1、当启动一个shell,操作系统会分配一记忆区块给shell使用,次内存的扁郎可以让子程序取用;
2、若在父程序利用export功能,可以让自定义便领的内容写到上述记忆区块中;
3、当加载另一个shell时,子shell可以将父shell的环境变量所在的记忆块导入自己的环境变量区块当中;

2.6、变量键盘读取、数组与宣告:read,declare,array

  • read 【-pt】variable
    -p:后面接提示字符
    -t:后面可接等待的秒数
  • declare/typeset
    宣告变量的类型
    declare 【-aixr】variable
    -a:将后面名为variable的变量定义为数据类型
    -i:将后面名为variable的变量定义为整数数字;
    -x:用法和export一样
    -r:将变量设定为readonly类型,该变量不可被更改内容,也不能unset
    变量默认类型为字符串
    declare -i sum=200+300
    将环境变量变为自定义变量
    declare +x sum
    将自定义变量变为环境变量
    declare -x sum
  • array:数组变量类型
    数组定义方式 var[index]=content
    var[0]=1

2.7、与文件系统及程序的限制关系

限制用户的某些系统资源,包括可以开启的档案数量,可以使用的cpu时间,可以使用的内容总量等等;
ulimit 【-SHacdfltu】 【配额】

2.8、变量内容的删除、取代与替换:删除与取代,测试与替换

  • 变量内容的删除与取代
    1、{variable#/*kerberos/bin} 代表从变量内容的最前面开始向删除,且删除最短的那个 2、{variable#/:}
    代表删除前面所有的内容,取最短的那个
    3、{variable##/*:} 代表删除前面所有的内容,去最长的那个 **注:符合取代文字的最短的哪一个;符合取代文字最长的那一个** 4、从后面开始删除 echo{path%:
    bin}
    echo ${path%%:*bin}
  • 变量内容的取代
    echo ${path/sbin/SBIN}
    两斜线中间的是旧字符串,后面的新字符串;
  • 变量的测试与内容个替换
    1、判断某个变量是否存在,若变量存在则使用既有的设定,若变量不存在则给予一个常用的设定;
    username={username-root} 2、变量内容未设定或未空字符串,则将username内容设定为root username={username:-root}
    3、如果想将旧变量一起替换掉,则用=号;
    var={str=newvar} 4、如果旧变量不存在,整个测试就告知我有错误 var={str?无此变数}

3、命令别名与历史记录

3.1、命令别名设定:alias,unalias

alias:查看别名
别名还可以取代既有的指令
取消别名:unalias

3.2、历史命令:history,HISTSIZE

history [n]:列出最近的n笔命令行表;
history[c]:将目前的shell中的所有history内容全部消除;
history [-arw] histfiles
-a:将目前新增的histroy指令新增如histfiles中,若没有加histfiles,则预设写入~/.bash_history
-r:将histfiles的内容读到目前这个shell的history记忆中
-w:将目前的history记忆内容写入histfiles中;
history还可以帮助执行指令
1、!number
执行第几笔指令
2、!commond
由最近的指令向前搜寻指令窜开头位commond的那个指令
3、!!
就是执行上一个指令

4、Bash shell的操作环境

4.1、路径与指令搜索顺序

指令运作顺序
1、以相对路径/绝对路径执行指令,如/bin/ls 或 ./ls
2、有alias找到该指令来执行
3、由bash内建的指令来执行
4、透过$PATH这个变量的顺序搜索寻到的第一个指令来执行

4.2、bash的进站与欢迎讯息:/etc/issue,/etc/motd

进站欢迎信息,在/etc/issue里面

4.3、环境配置文件:login,non-login shell,/etc/profile,/.bash_profile,source,/.bashrc

1、系统有一些环境文件案的存在,让bash在启动时直接读取这些配置文件,以规划好bash的操作环境。而这些配置文件又可以分为全体系统的配置文件以及用户个人偏好设置文件。想要保留设置,就得将这些设定写入配置文件;
2、login shell与non-login shell
login shell会读取这两个配置文件:
a)/etc/profile:这是系统整体的设定,你最好不要修改这个档案;
b) /.bash_profile或/.bash_login或~./profile:属于使用者个人设定,你要改自己的数据,就写入这里;

4.4、终端的环境设定:stty,set

stty可以帮助设定终端机按键代表意义
stty -a :将目前所有的stty参数列出来;
例如:stty erase ^h
set可以帮助我们设定整个指令输出/输入的环境
set 【-uvCHhmBx】
echo $- :显示目前所有的set设定值

4.5、通配符号与特殊符号

  • 通配符
    "* " :代表0个到无穷多个任意字符。
    "?":代表一定有一个任意字符。
    "[] " :同样代表一定有一个括号内的字符(非任意字符)。例如adcd代表一定有一个字符,可能是a,b,c,d这四个任何一个。
    "[-] ":若有减号在中括号内,代表在编码顺序内的所有字符,例如0-9代表0到9之间的所有数字,因为数字的语系编码是连续的。
    "[^]" :若中括号内的第一个字符为指数符号,那表示反向选择,例如[abc]代表一定有一个字符,只要非a,b,c的其他字符就接受的意思。
  • 特殊字符
    “#”:批处理符号,这个最长被使用在script当中,视为说明!在后的数据均不执行
    "":跳脱符号,将特殊字符或通配符还原成一般字符
    "|":管线,分割两个管线命令的界定
    ";":连续指令下达分隔符,连续性命令的界定(注意!与管线命令并不相同)
    "~":用户的家目录
    "":取用户变量前导符:亦即是变量之前需要加的变量取代值 "&":工作控制,将指令变成背景下工作 "!”:逻辑运算意义上的非not的意思 "/":目录符号,路径分割的符号 ">,>>":数据流重导向,输出符号,分别是取代和累加 "<,<<":数据流重导向,输入导向 " '' ":单引号,不具有变量置换的功能 " ":具有变量置换的功能 " `` ":两个`中间为可以先执行的指令,亦可使用()
    "()":在中间为子shell的起始与结束
    "{}":在中间为命令区块的组合

5、数据流重导向

5.1、何为数据流重导向

数据流重导向:数据流重导向可以将standard output与stardard error output分别传送到其他的档案或装置区,而分别传送所用的特殊字符则如下所示
1、标准输入 stdin:代码未0,使用<或<<;
2、标准输出 stdout:代码未1,使用>或>>;
3、标准错误输出stderr:代码为2,使用2>或2>>;
例如:ll / > ~/rootfile
该档案建立方式:
1、该档案若不存在(如~/rootfile)若不存在,系统会自动的将他建立起来,
2、当这个档案存在的时候,系统会先将这个档案清空,然后再写入数据;
3、也就是若以>输出到一个已经存在的档案中,那个档案就会被覆盖掉;
例子:
find /home -name.bashrc > list_right 2> list_error

  • /dev/null 垃圾桶黑洞装置与特殊写法
    如果我们知道错误会发生,所以要将错误信息忽略掉而不显示或存储,这个/dev/null可以吃掉任何导向这个装置的信息
    例如:
    find /home -name.bashrc 2> /dev/null
    如果要将正确与错误的数据统统写入同一个档案
    find /home -name.bashrc > list 2>&1
  • standard input : < 与 <<
    将原本需要有键盘输入的数据,改由档案内容来取代
    使用命令输出重导向的必要性:
    1、屏幕输出的信息很重要,而且我们需要将他存下来的时候;
    2、背景执行中的程序,不希望他干扰屏幕正常的输出结果时;
    3、一些系统的执行命令的执行结果,希望他可以保存下来;
    4、一些执行命令的可能已知错误讯息时,想以2> /dev/null将他丢弃掉;
    5、错误讯息与正确信息的分别输出时;

5.2、命令执行的判断依据

想要一次执行多个指令方法

  • cmd;cmd(不考虑指令相关性的连续下达指令)
    例如:sync;sync;shutdown -h now
  • ?(指令回传值)与&&或|| cmd1 && cmd2 1、若cmd1执行完毕切正确执行(?=0),则开始执行cmd2;
    2、若cmd1执行完毕且为错误(?!=0),则cmd2不执行; cmd1 || cmd2 1、若cmd1执行完毕且正确执行(?=0),则cmd2不执行;
    2、若cmd1执行完毕且为错误($?!=0),则开始执行cmd2;
    例如:ls /tmp/abc && touch /tmp/abc/hehe
    ls /tmp/abc || mkdir /tmp/abc
    ls /tmp/abc || mkdir /tmp/abc && touch /tmp/abc/hehe
    一般来说,假设判断式有3个,也就是
    command1 && command2 || command

6、管线命令

bash命令执行的时候又输出的数据出现,如果这群数据必须要经过几道手续之后才能得到我们所想要的格式,则可以使用管线命令。管线命令使用的是|这个界定符号。
管线命令仅会处理standard output,对于standard error output会予以忽略。
管线命令必须要能够接受来自前一个指令的数据成为standard input继续处理才行。

6.1、截取命令:cut,grep

cut的主要用途在于将同一行里面的数据进行分解,最长使用在分析一些数据或文字数据的时候。
例如: echo $PATH | cut -d ':' -f 3
cut是将一行讯息当中,取出某部分我们想要的,儿grep则是分析一行信息,若当中有我们所需要的信息,就讲该行拿出来。
例如:last | grep ’root‘

6.2、排序命令:sort,uniq,wc

sort 指令用于排序,而且可以依据不同的数据类型来排序;
unip 指令用于将重复的资料删除仅显示一个;
wc 指令用于计算这个档案里面有多少字,多少行,多少字符

6.3、双向重导向:tee

tee 指令用于在数据流处理过程中将某段信息保存下来;

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

tr 用于删除一段讯息当中的文字,或者是进行文字讯息的替换;
col 用来简单的奖tab按键取代成为空格;
join 处理两个档案之间的数据,而且,主要是在处理两个档案中,有相同数据的哪一行,才将他加在一起;
paste 直接将两行贴在一起,而且中间以tab键隔开;
expand 将tab按键转换成空格;

6.5、分割命令

split 将一个大档案,依据档案大小火行数来分割,将大档案分割成为小档案;

6.6、参数代换:xargs

产生某个指令的参数,xargs可以读入stdin的数据,并且以空格符或者断行符作为分辨,将stdin的资料分割成为arguments;

6.7、关于减号-的用途

管线命令在 bash 的连续处理程序中是相当重要癿!另外,在 log file 的分析当中也是相当重要的一 环, 所以请特删留意!另外,在管线命令当中,常常会使用到前一个指令的stdout 作为这次的
stdin , 某些指令需要用到文件名 (例如 tar) 杢迚行处理时,该 stdin 不 stdout 可以刟用减号 "-" 来替 代,

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容