概述:

    历史命令(history)、调用上一个命令最后一个参数(esc+.或!$)、命令展开机制(~,{,})、回显命令状态(echo $?)、引用命令执行结果($(command)或'command')、bash引用(强引用(“ ”)、弱引用(' ')。)、bash快捷键(ctrl+ a\e\u\k\l)、文件名通配(*\?\[ ]\[^ ])、输入输出错误重定向(>\>>\<\<<\2>\2>>\&>\&>>)、tr命令(替换字符)、tee(输出一份到屏幕,同时保留一份到文件)、hash(缓存或显示此前的命令)、shell变量、多命令执行(command1;comamnd2)


 

1、history:命令历史(设置、调用、控制)


a)、命令用法(shell进程会在会话中保存此前用户提交执行过的命令)

#history            //包括正常关机以前的命令,

[root@localhost ~]# type history    //history是个内嵌命令

history 是 shell 内嵌


#echo $HISTSIZE        //显示命令历史条数

HISTSIZE:他是一个环境变量,

HISTFILE: 每个用户下都有一个自己的保存历史命令的文件,且是隐藏的如:(.bash_history)。

#cat  .bash_history        //不会保存用户刚刚用过的命令,只有用户退出当前shell时才保存。


#echo $HISTFILESIZE        //显示命令历史文件的大小。

[root@localhost ~]# echo $HISTSIZE

1000

[root@localhost ~]# echo $HISTFILESIZE

1000


history命令用法:

[root@localhost ~]# help history

history: history [-c] [-d 偏移量] [n] 或 history -anrw [文件名] 或 history -ps 参数 [参数...]

    显示或操纵历史列表。

-c:清空命令历史

-d # :删除指定位置的历史命令

-d # n:删除从#位置开始的n个历史命令

-r: 从文件中读取历史命令

-w:将命令历史写入历史文件中。

-n: 显示最近的n条命令


b)、命令历史调用 

b1)、通过上下键来选择

b2)、通过!(感叹号)来实现:

#!n: 再一次执行历史命令列表中的第#条命令。

#!!:再一次执行上一条命令

#!STRING:在一次执行命令历史列表中最近一个以STRING开头的命令。

        

C)、调用上一条命令的最后一个参数

c1)、按下ESC键松开后再按点号(及esc+.)

如:

[root@localhost ~]# ls /etc/sysconfig/network-scripts/ifcfg-eno16777736

/etc/sysconfig/network-scripts/ifcfg-eno16777736

[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-eno16777736    //cat后输入esc+. ,会自动补充参数。


c2)、通过!$来实现

如:

[root@localhost ~]# ls /etc/sysconfig/network-scripts/ifcfg-eno16777736

[root@localhost ~]# cat !$            //

cat /etc/sysconfig/network-scripts/ifcfg-eno16777736


d)、控制历史命令记录的方法:

环境变量:HISTCONTROL

如:

[root@localhost ~]# echo $HISTCONTROL

ignoredups                //忽略重复的命令,重复是指紧挨着的两个命令一样,如果中间有间隔则不算。

[root@localhost ~]#


HISTCONTROL变量有三种值:

    ignoredups:忽略重复的值

    ignorespace:忽略以空白字符开头的命令

    ignoreboth:同时忽略两种以上情况

如:

[root@localhost ~]# HISTCONTROL=ignorespace    //改变命令历史的变量的值。

[root@localhost ~]# echo $HISTCONTROL

ignorespace                //命令历史不记录以空白字符开头的命令

[root@localhost ~]#



2、命令补全:(tab)

        shell程序在接收到用户执行命令的请求时,分析完成之后,最左侧的字符串会被当做命令执行:

        命令查找处理机制:

                查找内部命令:根据PATH环境变量中设定的目录,自左向右查找目录下的文件名:


3、路径补全:(tab)

        根据给定的起始路径下的字符串开头来补全。


4、命令行展开机制:

a)、~:    自动展开为用户的家目录,或者指定用户的家目录。

b)、{ } :可承载一个以逗号(,)分隔的路径列表,并能够将其展开为多个路径

    如:/tmp/{a,b} 相当于/tmp/a;/tmp/b


5、#echo $?:命令执行的状态结果(bash通过状态返回值来输出结果)

状态返回值:    

    成功:0

    失败:1-255

命令执行完成之后,其状态返回值会保存于bash的特殊变量$?中,且只能获得最近那条命令的执行结果:

如:

[root@localhost ~]# ls -ld /etc

drwxr-xr-x. 163 root root 12288 11月 13 14:49 /etc

[root@localhost ~]# echo $?

0

[root@localhost ~]# ls /ett

ls: 无法访问/ett: 没有那个文件或目录

[root@localhost ~]# echo $?

2

[root@localhost ~]# ecc /ec

bash: ecc: 未找到命令...

相似命令是: 'esc'

[root@localhost ~]# echo $?

127

[root@localhost ~]#



6、引用命令的执行结果

方法一:$(command) :$符号加上命令;

方法二:`command':    反引号括起来的命令;(一般不用此格式)

如:

[root@localhost ~]# date +%T

15:12:03

[root@localhost ~]# date +%H-%M-%S

15-12-37

[root@localhost ~]# date

2016年 11月 13日 星期日 15:12:45 CST

[root@localhost ~]# mkdir $(date +%H-%M-%S)        //运行引用命令时,先执行$后命令date +%H-%M-%S,将其结果作为变量 ,作为mkdir的参数执行。

[root@localhost ~]# ls

15-14-09  anaconda-ks.cfg  initial-setup-ks.cfg  公共  模板  视频  图片  文档  下载  音乐  桌面

[root@localhost ~]#

[root@localhost ~]# mkdir `date +%H-%M-%S`

[root@localhost ~]# ls

15-14-09  15-19-26  anaconda-ks.cfg  initial-setup-ks.cfg  公共  模板  视频  图片  文档  下载  音乐  桌面

[root@localhost ~]#


7:bash的引用:

a)、强引用(' '):任何字符串不做替换

b)、弱引用(" "):变量字符串会做替换

c)、命令引用$(command):


8、bash快捷键:

a)、ctrl+a:跳转至命令的开始位置;

b)、ctrl+e:跳转至命令行尾;

c)、ctrl+u:删除命令行首至光标位置的字符;

d)、ctrl+k:删除光标位置至行尾的字符;

e)、ctrl+l:清屏,相当于clear


9、变量:命名的内存空间。

    变量存储类型:整形、浮点型、字符型、布尔型、日期时间型

    变量对计算机来说只有两种:字符型、数值型(精确数值,近似数值)

    变量类型确定了变量的存储格式、数据范围、参与的运算;


10、文件名通配(globbing)

匹配模式:通过元字符来实现;元字符有:*、?、[ ]、[^ ]

    *:   匹配任意长度的任意字符;

    ?: 匹配任意单个字符;

    [ ]:    匹配指定范围内的单个字符;

            [a-z],[A-Z]:不区分大小写,匹配a-z中任意单个字母

            [0-9]:匹配0-9中的任意单个数字

            [a-z0-9]:匹配a-z0-9中的任意单个字符(不区分大小写)

            [abcdefg]:匹配abcdefg中任意一个字符。如:pa[0-9][0-9]:以pa开头的后接两个数字

            [[:upper:]]:任意大写A-Z字母中一个(外面的[ ]表示范围,里面的[:upper:]表示大写字母集合,以下雷同;如:[[:upper:]][0-9]:表示以任意单个大写字母开头后接一个数字的文件。

            [[:lower:]]:表示所有的小写字母中的单个字符;

            [[:alpha:]]:表示所有字母中的一个,相当于[[:upper:][:lower:]];

            [[:digit:]]:表示所有数字中的一个;

            [[:alnum:]]表示所有的字母和数字中的一个;

            [[:space:]]:表示所有空白字符中的一个;

            [[:punct:]]:所有标点符号中的一个;

    [^ ]:匹配指定范围外的单个字符;

            [^[:upper:]]: 匹配非大写字母中的一个字符

            [^0-9]:匹配非0-9中的单个字符

            [^[:alnum:]]:匹配非正常字符(字母和数字为正常字符)的单个字符


11、IO重定向

可用于输入的设备:文件(键盘、文件设备、网卡等)

可用于输出的设备:文件(显示、文件设备、网卡等)

程序数据流:

        输入数据流:标准输入 键盘

        输出数据流:标准输出 显示器

        错误输出流:错误输出 显示器

标准输入 0; 标准输出1 ;错误输出2;


a1)、输出重定向: >(用大于号表示(覆盖目标文件);输出重定向的标准输出是显示器,现在让它输出到其他地方)

a2)、输出重定向: >>(用两个大于号表示(追加输出到目标文件);输出重定向的标准输出是显示器,现在让它输出到其他地方)

如:

[root@localhost ~]# cat /etc/passwd > user        //将输出到显示器上的东西输出到user文件。

[root@localhost ~]# cat /etc/passwd /dev/tty1        //将输出结果重定向到虚拟终端tty上。(主要安全,)


a3)、#set -C :禁止覆盖输出重定向至已存在的文件。强制覆盖>|

            #set +C:启用覆盖输出重定向;

注意:> ; >>仅对正确的输出重定向


b)、错误输出重定向:2> ; 2>>

c1)、合并正常输出流和错误输出流:&>; &>>

c2)、合并正常输出流和错误输出流:command > /path/to/somefile 2>&1

            合并正常输出流和错误输出流:command >> /path/to/somefile 2>&1

特殊设备:/dev/null  


d1)、输入重定向:<


tr命令:转换或删除字符:(只能从标准输入中取值,不会修改原文件)

 tr [OPTION]... SET1 [SET2]  

把输入的数据当中的字符,凡是在set1定义范围内出现的字符,通通一对一的转换为set2出现的字符

如:tr abc ABC     //将a换成A,将b换成B,将c换成C;

[root@localhost ~]# tr  [a-z] [A-Z] < /etc/passwd

[root@localhost ~]# tr -d 'abc' < /etc/issue    //删除重定向输入中的指定字符abc

\S

Kernel \r on n \m

[root@localhost ~]#


d2)、输入重定向:<<  (存档用)

#cat > /path/to/somewhere <<eof        //表示输入时遇到eof停止输入,将此前输入的数据保存到somewhere中。(注意;eof可换成自己想要的字符)


12、| 管道命令:前一个命令的输出作为下一个命令的输入。(tee命令管道分发作用)

command1 | command2 | ......

如:

[root@localhost ~]# cat /etc/issue | tr 'a-z' 'A-Z'    //cat的输出作为tr的输入

\S

KERNEL \R ON AN \M

[root@localhost ~]#


[root@localhost ~]# cat /etc/issue | tee /tmp/issue.tee | tr 'a-z' 'A-Z'    //将cat命令输出给tee,tee保留一份到/tmp/issue.tee,并另一份给tr做输入

\S

KERNEL \R ON AN \M

[root@localhost ~]#


tee:command | tee /path/to/somewhere,    tee输出一份到屏幕,保留一份到文件somewhere。


13、命令hash:缓存或显示此前命令的位置。(命令的执行顺序先从hash缓存中查找,如果没有,在从$PATH环境命令中从左至右一次查找。

[root@promote ~]# ls -d /etc

/etc

[root@promote ~]# tail -1 /etc/passwd

fedora:x:1002:1002::/users/fedora:/bin/bash

[root@promote ~]# hash

hits    command

   1    /usr/bin/tail

   1    /usr/bin/ls

[root@promote ~]#


[root@promote ~]# type hash //查看hash命令类型

hash is a shell builtin

[root@promote ~]# help hash    //查看内部命令帮助

hash: hash [-lr] [-p pathname] [-dt] [name ...]

#hash -d:忘记hash命令

#hash -r:清空hash命令    //当命令移到其他位置时,需要清空缓存。



14、shell变量:

变量赋值:name=value

变量类型:变量存储值得类型,为了防止变量在内存中溢出,需要定义类型。变量类型决定了变量的存储格式,数据范围和参与的运算。

变量语言:强类型变量语言、弱类型变量语言。

bash是一种弱类型变量,他把所有变量类型视作字符型,bash变量不支持浮点型;bash中的变量不用事先申明。

变量替换:把变量名出现的位置替换为其所指向内存中的数据。

变量引用:${var_name}或$var_name

变量命名规范:由字母、数字、下划线一种或多种组成,不能以数字开头。

bash变量类型根据作用范围划分:本地变量、环境变量、局部变量、位置参数变量、特殊变量。

本地变量:作用于仅为当前shell进程

环境变量:作用域为当前shell进程及进程;

局部变量:作用域仅为某代码片段;

位置参数变量:用于在shell脚本内部,向执行脚本传递的参数;

特殊变量:shell内置的有特殊功用的变量(如:$?)


变量定义的方式:

    本地变量:

        变量赋值:name=value

        变量引用:${name},或$name

            "  " :弱引用,变量名会替换为值

             ' ':强引用,变量名不会替换为值

        查看变量:set

        变量撤销:unset  name    //不要加$

     

    环境变量:

         变量赋值一:export name=value

         变量赋值二 :name=value

                                export value

         变量赋值三: declare -x name=value       

         变量赋值四:    name=value

                                declare -x name     

         变量引用:${name},或$name   

注意:bash内置了许多环境变量(通常为全大写字母),用于定义bash的工作环境。(如:PATH\HISTFILE\HISTSIZE\SHELL\PWD\HOME\UID      

        查看变量:export、delcare -x、printenv、env(都可以查看)

        变量撤销:unset  name    //不要加$

查看进程树:pstree


定义只读变量一:delcare -r name //变成只读变量将无法撤销,不能改变值,存活为当前shell生命周期。

定义只读变量二:readonly name    //变成只读变量将无法撤销,不能改变值,存活为当前shell生命周期。


15、多命令执行:

格式:#命令1;命令2;命令n;.....    //命令先后执行,命令之间没有逻辑执行。

逻辑运算:

    与、或、非、异或;

短路运算:

    #COMMAND1 && COMMANG2    //command1为假,则后面的命令不在执行,否则,必须执行

    #COMMAND1 || COMMAND2        //command1为真,则后面的命令不执行,否则,必须执行后面的命令

如:

[root@promote ~]# touch abc.txt && tail -1 /etc/passwd > abc.txt    //如果前面的命令为真,执行后面的

[root@promote ~]# echo $?

0

[root@promote ~]# cat abc.txt

fedora:x:1002:1002::/users/fedora:/bin/bash

[root@promote ~]#


[root@promote ~]# id username || useradd username    //如果前面的命令为假,则执行后面的命令。

id: username: no such user

[root@promote ~]# id username

uid=1003(username) gid=1003(username) groups=1003(username)

[root@promote ~]#


16、shell脚本编程:

编程语言分类:(根据运行方式划分)

    编译运行:源代码--->编译器(编译成二进制文件)--->程序文件        //如c语言

    解释运行:源代码--->运行时启动解释器,由解释器边解释边运行;    //


根据其编程过程中调用库文件还是外部的程序文件划分:

    shell脚本编程:利用系统上的命令及编程组件进行编程。

    完整编程:通过调用库文件或依靠程序本身进行编程。


编程模型:过程式编程语言、面向对象的编程语言

    程序=指令+数据

    过程式编程语言:以指令为中心来组织代码,数据是服务于代码;(顺序执行;选择执行;循环执行);如c语言,bash,c++,python

    面向对象编程语言: 以数据为中心来组织代码,围绕数据来组织指令。(对象:类,方法);如:java,c++,python


shell脚本编程:过程式编程、解释编程、依赖外部程序文件运行:


编写shell脚本:

    脚本文件的第一行,顶格:给出shebang,解释器路径,用于指明解释执行当前脚本的解释器程序文件。

    常见的解释器:

    #!/bin/bash

    #!/usr/bin/python

    #!/usr/bin/perl


脚本就是命令的堆积,脚本中的空白行会被忽略,同时,除了shebang,其他以#开头的行都会被认为注释行而被忽略。


运行脚本:(shell脚本运行是在shell子进程下实现的

    (1)、赋予脚本执行权限,并直接运行此程序文件。

                    #chmod +x  /path/to/script_file

                    #./script_file或/path/to/script_file

    (2)、#bash script_file    //直接运行解释器,将脚本以命令行参数传递给解释器程序,此时script_file可以去掉执行权限。


文本编辑器:

行编辑器:sed

全屏编辑器:nano、vi、vim


17、bash的配置文件:(所有在命令行中的定义的变量或参数,都会随着shell的终止而终止,如果希望定义的参数一直在,可以通过更改bash配置文件来实现。)

bash配置文件有两类:profile类、bashrc类。

profile类:为交互式登录的shell提供配置。

bashrc类:为非交换式登录的shell提供配置。


登录类型:

交互式登录shell进程:直接通过某终端(tty\pts\ttys等)输入账号和密码后登录打开的shell进程;使用su - username或者su -l username执行的登录切换。

非交换式登录shell进程:使用su username执行的登录切换;图形界面下打开的终端;运行脚本;


profile类:(全局profile类、用户个人profile类)根据生效范围划分

    全局profile类:对所有用户都生效;/etc/profile、/etc/profile.d/*.sh

     个人profile类:只对单个用户生效;~/.bash_profile(个人家目录下的)

profile类的功能:1、用于定义环境变量;2、运行命令或脚本

交互式配置文件读取次序:/etc/profile--->/etc/profile.d/*--->~/.bash_profile--->~/.bashrc--->/etc/bashrc


bashrc类:(全局bashrc类、用户个人bashrc类)根据生效范围划分

    全局bashrc类:/etc/bashrc

    用户个人bashrc类:~/.bashrc(个人家目录下)

bashrc类的功能:1、定义本地变量;2、定义命令别名

非交换式配置文件读取次序:~/.bashrc--->/etc/bashrc--->/etc/profile.d/*


备注:仅有管理员有权限修改全局

            命令行中定义的特性,如变量和别名作用域为当前shell进程的生命周期;配置文件定义的特性,只对随后新启动的shell进程有效。

    让通过配置文件定义的特性立即生效:

        1)、通过命令行重复定义一次

        2)、让shell进程重读配置文件;

                        #source  /PATH/FROM/CONF_FILE

                    或#.  /PATH/FROM/CONF_FILE(如:#.  .bashrc)



18、bash脚本编程之算术运算:(+、-、*、/、%、**等)

linux中会把变量视为字符型数据,定义两个整形变量相加,输出仍会是字符型;如:

[root@promote tmp]# num1=1

[root@promote tmp]# num2=2

[root@promote tmp]# echo $num1+$num2

1+2

[root@promote tmp]# echo "$num1+$num2"

1+2

[root@promote tmp]#


算术运算格式:乘法符号可能需要转义符

    1)let

[root@promote tmp]# help let

let: let arg [arg ...]

    Evaluate arithmetic expressions.

如:

[root@promote tmp]# num1=1

[root@promote tmp]# num2=2

[root@promote tmp]# let sum=$num1+$num2

[root@promote tmp]# echo $sum

3

[root@promote tmp]#


    2)$[算术运算表达式]

    3)$((算术运算表达式))

    4)expr  变量1 运算符 变量2     //需要空格,不常用

如:

[root@promote tmp]# num1=1

[root@promote tmp]# num2=2

[root@promote tmp]# expr $num1 + $num2

3

[root@promote tmp]# sum=$(expr $num1 + $num2)

[root@promote tmp]# echo $sum

3

[root@promote tmp]#