第11章 认识与学习 bash

第11章 认识与学习 bash

标签: 鸟哥的linux私房菜


[toc]

11.1认识bash这个shell

什么是shell

只要能够操作应用程序的接口都能够称为shell。狭义的shell指的是命令行方面的软件,包括bash等。广义的shell则包括 图形化界面的软件,因为图形界面其实也能够操作各种应用程序来调用内核工作。

shell是Linux的任督二脉

各家的distributions使用的bash几乎都是一样的;
联机时命令行界面的传输速度比较快,而且不容易出现断线或者信息外流的问题;
可以用通过shell提供的数据流重定向以及管道命令 迅速分析日志信息;
etc

bash for Bourne Again SHell,这个Shell是 Bourne Shell的增强版本,也是的基于GNU的架构下发展出来的。

/etc/shells这个文件会记录系统上合法的shell

bash shell的功能

  • 命令记忆能力
    • 默认记忆1000个
    • 命令记录在主文件夹的.bash_history(内存内)中,~/.bash_history(注销后)记录的是前一次登录所执行过的命令。
    • 有一个隐忧,被黑客入侵,他只要追踪曾经执行过的命令。比如直接输入MySQL的密码在命令行里
  • 命令与文件补全功能([Tab]键的好处)
  • 命名别名设置功能(alias)
    • 命令行中输入alias就可以知道目前的命令别名有哪些
    • 在命令行可以直接执行alias ll='ls -al'来设置别名
  • 作业控制、后台、前台控制
    • 将作业丢到后台中执行
    • 可以在单一登录的环境中达到多任务的目的
    • 不担心不小心使用了[Ctrl]+C 中断了进程
  • 程序脚本

    • 类似DOC下的所谓的“批处理文件”;将需要执行的连续命令写成一个文件
  • 通配符

    • 星号“*”

bash shell的内置命令 : type

type [-tpa] name

  • type: 不加任何参数时,type会显示name是外部命令还是bash内置命令
  • -t:type会将name以下面这些字眼显示出它的意义:file(外部命令),alias(命令别名所设置的名称),builtin(bash内置的命令功能)
  • -p:如果 后面接的name为外部命令才会显示完整文件名
  • -a:会由PATH变量定义的路径中,将所有含nam的命令都列出来,包含alias

命令的执行

[Enter]具有“开始执行”的功能
可以被反斜杠“"转义成换行

11.2shell的变量功能

环境变量;变量的使用与设置
Linux是一个多用户,多任务的环境,bash如何得知你的邮件信箱是哪一个问价

什么是变量

用一个简单的“字眼”来代替另一个比较复杂或者是比较容易变动的数据。这最大的好处就是“方便”。

  • 变量的可变性与方便性

    • 邮箱(mail)通过MAIL这个变量来进行访问,MAIL这个变量和登录用户的登录名挂钩
  • 影响bash环境操作的变量

    • 环境变量
  • 脚本程序设计(shell script)的好帮手

    • 变量相当于配置文件,一改全改

变量的显示与设置:echo, unset

  • 变量的显示:echo
echo $PATH
echo ${PATH}

当一个变量名称未被设置是,默认的内容是“空”的

  • 变量的设置规则
    1.变量与变量内容以一个“=”来连接,如下
    myname=Rockhan
    2.等号两边不能直接接空格符
    3.变量名称只能是英文与数字,但开头的字符不能是数字
    4.变量内容若有空格符可使用双引号"或单引号'(英文格式),将变量内容结合起来,需注意
     4.1双引号内的特殊字符如$等,可以保持原来的特性
     4.2单引号内的特殊字符则仅为一般字符
    5.可以用转义字符将特殊字符变成一般字符

环境变量的功能

  • 可以利用两个命令查阅环境变量:env 与 export
  • set可以查看所有变量
  • $本身也是个变量,代表的是这个shell的线程代号,即所谓的PID(Process ID)可以用
    echo $$ 命令查看
  • ?,上个执行命令的回传码。成功执行为0,不成功非0
  • export:自定义变量转成环境变量(两者的差别在于是否会被子进程所继续引用),子进程仅会继承父进程的环境变量,不会继承父进程的自定义变量。

影响显示结果的语系变量(locale)

loacale -a查询Linux支持哪些语系
常见的两种中文编码:big5,utf-8
loacale命令显示所有与语系有关的变量数据。
环境变量LANG是主语言的环境

变量的有效范围

为什么环境变量的数据可以被子进程所引用呢?这是因为内存配置的关系。理论上是这样的:

  • 当启动一个shll,操作系统会分配一记忆块给shell使用,此内存内的变量可让子进程取用;
  • 若父进程利用export功能,可以让自定义变量的内容写到上述的记忆块当中(环境变量);
  • 当加载另一个shell时(即启动子进程离开父进程),子shell可以将父shell的环境变量所在的记忆块导入自己的环境变量块当中。
  • 注意:‘环境变量’和‘bash的操作环境’意思不太一样。PS1并不是环境变量但会影响到bash的接口(提示符)

变量键盘读取、数组与声明:read,array,declare

  • read,要想读取来自键盘输入的变量,就是用read命令。这个命令最常被用在shell script的编写中,用于与用户对话
    read [-pt] name -p显示的内容,-t 等待的时间
  • declare/typeset,声明变量的类型,不带参数
    declare [-aixr] name -a数组,-i 整数,-x 变成环境变量,同export,-r设置为readonly,不可更改不可重设
$sum=100+300+50
$echo $sum
100+300+50
$declare -i sum=100+300+50
$echo $sum
450
  • 默认变量类型为“字符串”
  • bash环境的中的数值运算,默认最多仅能到达整数类型,1/3结果为0
    • 如果不小心把变量设置为“只读”,只能注销再登录才能复原该变量的类型
  • 数组变量类型
    • 数组的设置方式var[index] = content

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

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

变量内容的删除、替代与替换

除了直接设置变量内容之外,我们可以将变量的内容进行微调。

  • 变量内容的删除
hanzhou@hanzhou-VirtualBox:~$ echo $path
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
hanzhou@hanzhou-VirtualBox:~$ echo  ${path#/*:}
/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
hanzhou@hanzhou-VirtualBox:~$ echo  ${path##/*:}
/usr/local/games

一个#号删除从左往右最短的那个,两个#号从左往右删除最长的那个
从右往左 用%号

-变量内容的替换

hanzhou@hanzhou-VirtualBox:~$ echo $path
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
hanzhou@hanzhou-VirtualBox:~$ echo ${path/sbin/SBIN}
/usr/local/SBIN:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

一条斜线只替换第一个字符串,两条斜线替换所有符合的内容

-变量的测试与内容替换

hanzhou@hanzhou-VirtualBox:~$ echo $username

hanzhou@hanzhou-VirtualBox:~$ username=${username-root}
hanzhou@hanzhou-VirtualBox:~$ echo $username
root
hanzhou@hanzhou-VirtualBox:~$ user_name=''
hanzhou@hanzhou-VirtualBox:~$ user_name=${user_name-root}
hanzhou@hanzhou-VirtualBox:~$ echo $user_name 

echo 出来变量内容为空,不一定就没有这个变量,也许是变量内容是空字符串
-(减号):if not none:the former,esle: the later
+(加号):if not none:'',esle thelatr


来自新浪微博

11.3命令别名与历史命令

命令别名设置:alias,unalias

$alias lm='ls -l | more'
alias的定义规则与变量规则几乎相同
root可以rm(删除)任何数据,但rm提供了一个参数让我们确认是否删除文件,-i,我们可以这样做:$alias rm='rm -i'
以后使用rm的时候不用太担心错误删除的情况
$alias这个命令可以查看目前有哪些命名别名

取消命名别名:
$unalias lm

命名别名与变量的区别:我们可以直接执行命名别名,变量必须要通过类似echo命令才能够调用变量的内容。

历史命令: history

history 调出所有记录的历史命令(带序号,最近的一条数字最大)
history n 调出最近n条 历史记录
!66执行第66条命令
!!执行上一条命令,相当于↑+enter
!al执行最近以al为开头的命令
echo $HISTSIZE (一般是1000)这个变量决定 ~/.bash_history文件中记录的历史命令的最大条数

  • 当我们以bash登录linux主机后,系统会自动由主文件的~/.bash_history读取以前曾经下过的命令。
  • 默认是在用户注销时才会将history中的内容写入记录文件histfiles(一般是~/.bash_history),所以很多人不会开多个bash接口,而是用单一bash登录,再用作业控制(job control)来切换工作,这样才能将曾经执行过的命令记录下来
  • 无法记录时间:历史命令默认不记录执行命令的时间,只有执行顺序,序号不会变(101~1100),可以通过~/.bash_logout来进行history的记录,并加上date来增加时间参数。

11.4 bash shell的操作环境

路径与命令查找顺序

命令运行的顺序可以这样看:
1.以相对/绝对路径执行命令,例如"/bin/ls" 或 "./ls";
2.由alias找到该命令来执行;
3.由bash内置的(builtin)命令;
4.通过$PATH这个变量的顺序找到的第一个命令来执行。

11.5 数据流重定向

标准输入(stdin:standard input):代码为0,使用<或<<
标准输出(stdout):代码为1,使用>或>>
标准错误输出(stderr):代码为2,使用2>或2>>

输出

示例:

  • 将正确和错误的输出结果分别存入不同的文件:
    find /home -name .bashrc > list_right 2> list_error

  • 将正确和错误的输出结果存入一个文件:
    find /home -name .bashrc > list 2>&1

    find /home -name .bashrc &> list

  • 可以将错误信息以“2> /dev/null”丢弃

注意:有错误信息但没有输出到文件内时就会输出到屏幕上

标准输入

$cat >catfile 
testing
cat file test

(输入完成要按[ctrl]+d 来离开)

  • catfile会被主动创建,并将我们输入的内容内容写入文件。
  • 也可以用某个文件的内容来代替键盘的输入
$cat >catfile < ~/.bashrc

~/.bashrc文件的内容输入到catfile中

  • 控制字符的用法
$cat >catfile << "eof"
this is a test
ok,now stop
eof ##输入这个关键词,立刻就结束而不需要输入[ctrl]+d

命令执行的判断依据:;,&&,||

  • cmd;cmd(不考虑命令相关性的连续命令执行)
    $sync;sync;
  • $?(命令回传码)与&&或||

cmd1&&cmd2;##若cmd1执行正确($?=0)开始执行cmd2,否则命令回传码不为0,cmd2不执行
cmd1||cmd2;##cmd1执行正确,cmd2不执行,cmd1执行不正确,cmd2执行

ls/tmp/abc || mkdir /tmp/abc && touch /tmp/abc/hehe

11.6 管道命令(pipe)

cmd1 | cmd2 | cdm3

选取命令:cut,grep

一般来说,选取信息通常是针对“”来分析的,并不是通篇信息分析的。

  • cut 用于取出我们想要的数据
    cut -c 12-截取文本每行第十二字符往后的内容
    cut -d ':' -f 3,5按冒号分隔每行字符,并取出第三个和第五个 字符区间
hanzhou@hanzhou-VirtualBox:~$ echo $PATH 
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
hanzhou@hanzhou-VirtualBox:~$ echo $PATH | cut -d ':' -f 3,5
/usr/sbin:/sbin
  • grep 用于分析一行信息,若当中有我们所需要的信息,就将该行拿出来。
    last | grep 'hanzhou':last 命令显示登录者信息,用gerp取出含有'hanzhou'的行。
    -v反向选择,显示没有查找信息的行
    -i 忽略(ignore)大小写
    -n 顺便输出行号

grep 'MANPATH' /etc/man.config显示/etc/man.config文件中含有'MANPATH'的行

排序命令:sort,wc,uniq

sort [-fbMnrtuk] [file or stdin]

hanzhou@hanzhou-VirtualBox:~$ last | cut -d ' ' -f 1 | sort | uniq -c
      1 
     27 hanzhou
      6 reboot
      1 wtmp

好奇怪,sort和grep的参数作用是一样的,但是用的字母竟然还不一定啊,
sort -f忽略大小写,-t分隔符 -k以那个区间(field,字段)排序(可以选择多个字段排序么?好像可以)
cut -i忽略大小写,-d (delimter) -f

原因是:sort 的-i,是忽略不可打印内容,-d只考虑空白区域和字母字符

wc:
wc for word count
-l 仅列出行
-w 仅列出多少字(英文)
-m 多少字符 (-c也是一样)

last | grep [a-zA-Z] | grep -v 'wtmp' | wc -l得到登录总人次
第一个greo得到非空白行,第二个去掉wtmp行

双向重定向:tee

tee会同时将数据流送与文件与屏幕

hanzhou@hanzhou-VirtualBox:~/abc$ tee test.txt
this is a test.
this is a test.
check
check
^C
hanzhou@hanzhou-VirtualBox:~/abc$ cat test.txt 
this is a test.
check

hanzhou@hanzhou-VirtualBox:~/abc$ tee -a test.txt 
another test
another test
over
over
^C
hanzhou@hanzhou-VirtualBox:~/abc$ cat test.txt 
this is a test.
check
another test
over
hanzhou@hanzhou-VirtualBox:~/abc$ 

-a 以append追加模式写入
第一次cat的时候为什么多一个空白行???

hanzhou@hanzhou-VirtualBox:~/abc$ last | tee newtest |cut -d ' ' -f 1

写入newtest的结果没有经过cut处理,但是打印出来的内容显然进过cut处理了

tee的用处:可以让standard output转存一份到文件内并将同样的数据继续送到屏幕去处理。这样除了可以让我们同时分析一份数据并记录下来之外,还可以作为处理一份数据的中间暂存盘记录之用。而且tee是很多认证考试中很容易考的。(ORZ)

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

DOS断行字符与unix断行字符是不一样的,可以用dos2UNIX与UNIX2dos来完成转换

  • tr
     tr可以用来删除一段信息中的文字,或者是进行文字信息的替换
hanzhou@hanzhou-VirtualBox:~/abc$ last | tr '[a-z]' '[A-Z]'

该例把小写字母全部转为大写字母
-d 删除某个字符串

  • col
     一般用col将[tab]按键替换为空格键,此外还经常被用于将man page转存为纯文本文件已方便查阅的功能
    -x 将tab 换成对等的空格键
    -b 在文字内有反斜杠

  • join
     join用于处理两个文件之间的数据,

  • expand
    常用于把tab转为空格,可以指定几个空格

  • 切割命令split
    文件太大时,按照大小或者行数 split 成为多个小文件
    -l按行,-b按照大小

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

推荐阅读更多精彩内容