概述:
历史命令(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]#
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。