美文网首页
bash的基础特性

bash的基础特性

作者: SRE1 | 来源:发表于2019-03-26 19:08 被阅读0次

bash的基础特性之一:命令历史

命令历史:shell进程会在其会话中保存此前用户提交执行过的命令

[root@node1 ~]# history
1  poweroff
2  which
3  which --skip-alias

定制history的功能,可通过环境变量实现
HISTSIZE:shell进程可保留的命令历史的条数

[root@node1 ~]# echo $HISTSIZE
1000

HISTFILE:持久保存命令历史的文件

[root@node1 ~]# echo $HISTFILE
/root/.bash_history

HISTFILESIZE:命令历史文件的大小

[root@node1 ~]# echo $HISTFILESIZE
1000

命令用法:
history [-c] [-d offset] [n] or history -anrw [filename] or history -ps arg [arg...]

-c:清空历史命令

[root@promote ~]# history -c
[root@promote ~]# history
1  history

-d offset:删除指定历史命令

[root@promote ~]# history
1  history -d 1
2  ls
3  ll
4  history
[root@promote ~]# history -d 2
[root@promote ~]# history 
1  history -d 1
2  ll
3  history
4  history -d 2
5  history 

-r:从文件读取历史命令至历史列表中
-w:把历史列表中的命令追加至历史文件中

history #:显示最近的#条命令

[root@promote ~]# history 2
7  history #
8  history 2

调用历史命令列表中的命令:

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

[root@promote ~]# !31
pwd
/root

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

[root@promote ~]# ls
anaconda-ks.cfg
[root@promote ~]# !!
ls
anaconda-ks.cfg

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

注意:命令的重复执行有时候需要依赖于幂等性

调用上一条命令的最后一个参数:

快捷键:ESC+ .

字符串:!$

控制命令历史记录的方式:
环境变量:HISTCONTROL

字符名称 含义
ignoredups 忽略重复命令
ignorespace 忽略以空白字符开头的命令
ignoreboth 以上两者同时生效

修改变量的值:NAME='VALUE' (仅对当前shell进程有效)

bash的基础特性之二:命令补全

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

命令处理机制:

  • 查找内部命令
  • 根据PATH环境变量中设定的目录,自左而右逐个搜索目录下的文件名

给定的打头字符串如果能唯一标识某命令程序文件,则直接补全
不能唯一标识的某命令程序文件,再击tab键一次,会给出列表

路径补全:
在给定的起始路径下,以对应路径下的打头字串来逐一匹配起始路径下的每个文件

tab:如果能唯一标识,则直接补全
否则,再按一次tab,给出列表

bash的基础特性之三:命令行展开(可看第二周作业)

字符名称 含义
~ 自动展开为用户的家目录,或指定的用户的家目录
{} 可承载一以逗号分割的路径列表,并能将其展开为多个路径

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

例题1:如何创建/tmp/x/y1,/tmp/x/y2,/tmp/x/y1/a,/tmp/x/y1/b

 [root@promote ~]# mkdir -pv /tmp/x/{y1/{a,b},y2}

例题2:如何创建a_c,a_d,b_c,b_d

 [root@promote ~]# mkdir -v {a,b}_{c,d}

例题3:创建如下目录结构

/tmp/mysysroot/

├── bin

├── etc

│   └── sysconfig

│       └── network-scripts

├    ── sbin

├── usr

│   ├── bin

│   ├── lib

│   ├── lib64

│   ├── local

│   │   ├── bin

│   │   ├── lib

│   │   └── sbin

│   └── sbin

└── var

├── cache

├── log

└── run
[root@promote ~]# mkdir -pv /tmp/mysysroot/{bin,sbin,etc/sysconfig/network-scripts,usr/{bin,sbin,local/{bin,sbin,lib},lib,lib64},var/{cache,log,run}}

bash的基础特性之四:命令的执行状态结果

命令执行的状态结果:
bash通过状态返回值来输出此结果

成功:0
失败:1-255

命令执行完成之后,其状态返回值保存于bash的特殊变量$?中

[root@promote ~]# lss
-bash: lss: command not found
[root@promote ~]# echo $?
127

命令正常执行时,有的还会有命令返回值
根据命令及其功能不同,结果各不相同
引用命令的执行结果:

$(COMMAND)
或‘COMMAND’

[root@promote ~]# date +%T
18:42:37
[root@promote ~]# mkdir $(date +%T)
[root@promote ~]# ls
18:43:03  anaconda-ks.cfg

bash的基础特性之五:引用

字符名称 含义
' ' 强引用
'' '' 弱引用
'' '' 命令引用

bash的基础特性之六:快捷键

字符名称 含义
ctrl+a 跳转至命令行首部
ctrl+e 跳转至命令行尾部
ctrl+u 删除行首至光标所在处之间的所有字符
ctrl+k 删除光标所在处至行尾的所有字符
ctrl+l 清屏,相当于clear

bash的基础特性之七:globbing:文件名通配(整理文件名匹配,而非部分)

匹配模式:元字符

*:匹配任意长度的任意字符
pa*,*pa*,*pa,*p*a

?:匹配任意单个字符
pa?,??pa,p?a,p?a?

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

特殊格式:
[a-z],[A-Z],[0-9],[a-z0-9],[abcxyz]

字符名称 含义
[[:upper:]] 所有大写字母
[[:lower:]] 所有小写字母
[[:alpha:]] 所有字母
[[:digit:]] 所有数字
[[:alnum]] 清所有字母和数字
[[:space:]] 所有空白字符
[[:punct:]] 所有标点符号
[^] 匹配指定范围外的任意单个字符
[^[:upper:]] 非大写字母的字符
[^0-9] 非数字的字符
[^[:alnum]] 非字母和数字的字符

练习1:显示/var目录下所有以l开头,以一个小写字母结尾,且中间出现一位任意字符的文件或目录

[root@promote ~]# ls -d /var/l?[[:lower:]]

练习2:显示/etc目录下,以任意一位数字开头,且以非数字结尾的文件或目录

[root@promote ~]# ls -d /etc/[0-9]*[^0-9]

练习3:显示/etc目录下,以非字母开头,后面跟一个字母及其他任意长度任意字符的文件或目录

[root@promote ~]# ls -d /etc/[^a-z][a-z]*

练习4:复制/etc目录下,所有以m开头,以非数字结尾的文件或目录至/tmp/megedu.com目录

[root@promote ~]# cp -r /etc/m*[^0-9] /tmp/mgedu.com/

练习5:复制/usr/share/man目录下,所有以man开头,后跟一个数字结尾的文件或目录至/tmp/man/目录下

[root@promote ~]# cp -r /usr/share/man/man[0-9] /tmp/man/

练习6:复制/etc目录下,所有以.conf结尾,且以m,n,r,p开头的文件或目录至/tmp/conf.d/目录下

[root@promote ~]# cp -r /etc/[mnrp]*.conf /tmp/conf.d/

bash的基础特性之八:IO重定向及管道

程序:指令+数据,IO

可用输入的设备:文件
键盘设备,文件系统上的常规文件,网卡等

可用输出的设备:文件

显示器,文件系统上的常规文件,网卡等

程序的数据流

  • 输入的数据流:<-- 标准输入(stdin),键盘
  • 输出的数据流:--> 标准输出(stdout),显示器
  • 错误输出流: --> 标准输出(stderr),显示器

fd:file descriptor,文件描述符

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

IO重定向:

  • 输出重定向:>
    特性:覆盖输出(覆盖原有文件,慎用)
  • 输出重定向:>>
    特性:追加输出(保留原有文件的内容)

# set:设置或者撤销shell选项的值
-C:禁止覆盖输出重定向至已存在的文件
此时可使用强制覆盖输出:>|
# set +C:关闭上述特性
错误输出流重定向:2>,2>>

合并正常输出流和错误输出流:

  • &>,&>>
  • COMMAND > /path/to/somefile 2>&1
    COMMAND >> /path/to/somefile 2>&1

特殊设备:/dev/null/

输入重定向:<

tr:把输入数据当中的数据,凡是在SET1定义范围内出现的,通通对位转换为SET2出现的字符
tr SET1 SET2 < /PATH/FROM/SOMEFILE

[root@promote ~]# tr [a-z] [A-Z]
how are you
HOW ARE YOU

tr -d:删除输出到屏幕上的指定字符,不会影响原文件

tr -d SET1 < /PATH/FROM/SOMEFILE
Here Document:<<
cat << EOF
cat > /PARH/TO/SOMEFILE << EOF

[root@promote ~]# cat > /tmp/cat.out << END
> how are you
> END
[root@promote ~]# cat /tmp/cat.out
how are you

管道:连接程序,实现将前一个命令的输出直接定向后一个程序当作输入
COMMAND1 | COMMAND2 | COMMAND3 . . .

[root@promote ~]# echo how are you | tr [a-z] [A-Z]
HOW ARE YOU

tee命令:实现将数据分方向发送
COMMAND | tee /PATH/TO /SOMEFILE

练习:把/etc/passwd文件的前6行的信息转换为大写字符后输出

[root@promote ~]# head -6 /etc/passwd | tr [a-z] [A-Z]
ROOT:X:0:0:ROOT:/ROOT:/BIN/BASH
BIN:X:1:1:BIN:/BIN:/SBIN/NOLOGIN
DAEMON:X:2:2:DAEMON:/SBIN:/SBIN/NOLOGIN
ADM:X:3:4:ADM:/VAR/ADM:/SBIN/NOLOGIN
LP:X:4:7:LP:/VAR/SPOOL/LPD:/SBIN/NOLOGIN
SYNC:X:5:0:SYNC:/SBIN:/BIN/SYNC

bash的基础特性之九:命令hash

缓存此前命令的查找结果:key-value(数据格式)

key:搜索键
value:值

hash命令:

hash:列出
hash -d COMMAND:删除
hash -r:清空

bash的基础特性之十:变量

程序:指令+数据

  • 指令:由程序文件提供;
  • 数据:IO设备、文件、管道、变量

另一个角度:
程序:算法+数据结构

变量=变量名+指向的内存空间

变量赋值:name=value
变量类型:存储格式、表示数据范围、参与的运算

编程语言:

  • 强类型变量:C语言,python(无需事先声明)
  • 弱类型变量:

bash把所有变量统统视作字符型,不支持浮点类型
bash中的变量无需事先声明;相当于,把声明和赋值过程同时实现
声明:说明变量类型,声明变量名称

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

[root@promote ~]# first_name=haha
[root@promote ~]# echo $first_name
haha

变量引用:$var_name,一般情况下可以省略括号

变量名:变量名只能包含数字、字母和下划线,而且不能以数字开头
变量名要做到见名知义,命名机制遵循某种法则;不能够使用程序的保留字,例如if, else, then, while等等

bash变量类型:

  • 本地变量:作用域仅为当前shell进程
    变量赋值:name=value
    变量引用: $name
" ":变量名会替换为其值
' ':变量名不会替换为其值
查看变量:set
撤销变量:unset name
注意:此处非变量引用

增加PATH路径

[root@centos7 ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@centos7 ~]# PATH="$PATH:/usr/local/apapche/bin"
[root@centos7 ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/apapche/bin
  • 环境变量:作用域为当前shell进程及其子进程
 变量赋值:
  (1) export name=value
  (2) name=value
      export name
  (3) declare -x name=value  声明环境变量
  (4) name=value
      declare -x name

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

注意:bash内嵌了许多环境变量(通常为全大写字符),用于定义bash的工作环境
PATH, HISTFILE, HISTSIZE, HISTFILESIZE, HISTCONTROL, SHELL, HOME, UID, PWD, OLDPWD

查看环境变量:export, declare -x, printenv, env
撤销环境变量:unset name

只读变量(常量):
只读变量无法重新赋值,并且不支持撤销;存活时间为当前shell进程的生命周期,随shell进程终止而终止

(1) declare -r name
(2) readonly name
  • 局部变量:作用域仅为某代码片断(函数上下文)

  • 位置参数变量:当执行脚本的shell进程传递的参数

  • 特殊变量:shell内置的有特殊功用的变量

$?:
0:成功
1-255:失败

bash的基础特性之十一:多命令执行

COMMAND1; COMMAND2; COMMAND3; ...

逻辑运算:
运算数:真(true, yes, on, 1),假(false, no, off, 0)

与:

1 && 1 = 1
1 && 0 = 0
0 && 1 = 0
0 && 0 = 0

或:

1 || 1 = 1
1 || 0 = 1
0 || 1 = 1
0 || 0 = 0

非:

! 1 = 0
! 0 = 1

短路法则:

COMMAND1 && COMMAND2实现控制功能 COMMAND1为“假”,则COMMAND2不会再执行; 否则,COMMAND1为“真”,则COMMAND2必须执行;COMMAND1 || COMMAND2`
COMMAND1为“真”,则COMMAND2不会再执行;
否则,COMMAND1为“假”,则COMMAND2必须执行;

例:id username || useradd username

相关文章

  • shell 编程

    回顾: bash 的基础特性(3)

  • bash基础特性第一篇

    1.bash的基础特性之:命令行展开 常用选项 实例 2.bash的基础特性之:命令的执行状态结果 bash通过状...

  • Linux之bash

    bash的基础特性之 IO重定向及管理 ] IO重定向: 输入重定向: 管道 bash基础特性之自动补充命令 ba...

  • Bash基础特性

    命令别名(alias)(1)alias不带参数显示所有alias(2)alias key='value'定义别名只...

  • bash基础特性

    Linux系统上的文件类型: -:常规文件,即f d:directory,目录文件 b:block device,...

  • bash的基础特性

    1.查看命令的执行状态返回值的方法: echo $? 2.查看命令返回值的结果 返回值是 0,就代表程序执行成功 ...

  • bash的基础特性

    bash的基础特性之一:命令历史 命令历史:shell进程会在其会话中保存此前用户提交执行过的命令 定制histo...

  • Linux上的文件管理及用户权限管理

    1.bash的基础特性: bash的基础特性:命令的执行状态结果 2.IO重定向及管道 3.目录管理类的命令:mk...

  • linux基础(六)

    bash基础特性 根据作用域划分 本地变量 环境变量

  • bash基础特性(一)

    bash是Unix shell的一种,在1987年由布莱恩·福克斯为了GNU计划而编写。1989年发布第一个正式版...

网友评论

      本文标题:bash的基础特性

      本文链接:https://www.haomeiwen.com/subject/cdpnvqtx.html