Shell
Shell简介
Shell:命令行解释器,是用户与系统沟通时的媒介。Linux采用bash为其默认shell系统可以使用的shell记录在/etc/shells
Bash:Bourne-again Shell的缩写。GNU计划的一个组件。与Unix上的Bourne Shell完全兼容。红帽企业版linux默认的Shell是Bash.
Bash的特点:
①支持命令行输入、操作历史查询、快捷键、使用变量等功能。
②支持通配符、别名、串操作、文件测试、整形算数运算等功能。
③Bash可以交互使用,或者作为一种强大的脚本语言来使用超过60个的shell变量。
Bash快捷键
Ctrl + d:输入已结束 在shell下相当于一个exit
Ctrl + c:键盘中断请求
Crtl + z:挂起
Ctrl + s & Ctrl + q:暂停/恢复屏幕输出
Ctrl + l:清屏 相当于clear
Tab:自动补完命令行与文件名 列出所有可能的选择
Ctrl + a:光标移到行首
Ctrl + e:光标移到行尾
Ctrl + k:从光标所在处删除到行结尾
Ctrl + u:删除整行
Esc + f:光标移到下一个单词的开始处
Esc + b:光标移到前一个或当前单词的开始处
Bash的限制
①资源型敏感,对CPU负担重的程序
②复杂的大项目
③需要灵活处理文件的程序(逐行)
④需要图形用户界面的程序需要直接与系统硬件打交道的程序
⑤需要访问I/O端口和网络套接字的程序
⑥需要使用库或和以前的其他代码整合的程序
Bash的如何处理命令
Bash命令的优先级
上面提到了一个命令的优先级,一共有那几种“命令”?
alias cp vm rm
keyword if while until case for
functions 函数
builtin #man alias
$PATH #echo $PATH
Bash的操作环境
Bash 4个主要环境设置文件
全局设置文件:
/etc/profile
/etc/bashrc
用户设置文件:
~/.bashrc
~/.bash_profile
Bash其他设置文件
~/.bash_logout
~/.bash_history
/etc/profile.d/*.sh
set
Bash还有一些与操作接口有关的变量,以及用户自定义变量的存在。set命令还会将其他bash内的变量全部显示出来。
stty
设置tty终端,控制backspace是删除等功能
终端环境 - set选项
-f 使路径名替换(匹配)无效
-n 读取命令,但不执行(用来对脚本进行语法检查)
-o optionname 设置指定的选项,一些常用的选项如下:
emacs
使用emacs风格的命令行快捷键
ignoreeof
当EOF(Ctrl+D)被读取时,不退出shell。
vi
使用vi风格的命令行快捷键
-v 在命令被读取时打印命令(调试脚本时有用)
-x 在替换被应用之后打印命令(调试脚本和检查shell替换时有用)
-C 不允许shell在重定向中损坏文件。
PS1命令提示符:
\d 可显示出[星期 月 日]的日期格式,如:“Mon Feb 2”。
\H 完整的主机名。
\h 主机名在第一个小数点前的名字,如www后面省略。
\t 显示时间,为 24 小时格式的[HH:MM:SS]。
\T 显示时间,为 12 小时格式的[HH:MM:SS]。
\A 显示时间,为 24 小时格式的[HH:MM]。
\@ 显示时间,为 12 小时格式的[am/pm]样式 。
\u 目前使用者的账号名称,如root。
\v BASH的版本信息。
\w 完整的工作目录名称,由根目录写起的目录名称,家目录
会以~ 替代。
\W 调用basename函数的工作目录名称,所以仅会列出最后
一个目录名。
\# 下达第几个指令。
\$ 提示字符。root时是#,否则就是$。
Bash的启动
Shell的自动启动
无论何时登录或者打开终端,shell都会自动启动
Bash - export
export 变量名 自定义变量转换成环境变量
export 查看环境变量
Bash - history
1、在bash中输入history指令可以查询用户的过往操作。
2、history记录在内存中而定。
3、history表在用户logout时会记录入用户主目录下的.bash_history文件中,在下次login时载入。
如何使用history?
使用 ! 来调用历史命令
!!:重复执行上一条命令
!ex:重复执行上一条以ex为开头的命令
!N:重复执行上一条在history表中记录号码为N的命令
!-N:重复执行前面第N条命令
Bash - alias
在shell下键入alias可以查询当前alias列表。
用户可以alias来为一条命令取一个简单的别名
用户也可以用unalias来取消一条别名记录。
alias记录在shell中总是先执行。
Bash欢迎信息
进入系统时的:/etc/motd
#echo 'Welcome!' > /etc/motd
登录系统是的:/etc/issue
/etc/issue.net
#cat /etc/issue
RHEL5.8 (magedu) \m
Date:\d \t
terminal:\l
特殊字符的含义:
\d 本地日期
\m 硬件等级
\o 域名
\t 本地时间
\v 操作系统版本
\l 终端号
\n 网络名
\r 操作系统版本
\s 操作系统名称
输入输出、重定向
基于终端的程序往往从一个源读取信息,像一个目的地写入信息。
程序读取的源被称为标准输入 – stdin。
程序写入目的地被称为标准输出 – stdout。
程序通常把错误状况报告给标准错误 – stderr。
stdin:键盘。
stdout、stderr:终端、显示器
通常情况下,标准错误与终端的显示器相连,错误信息与标准输出混合在一起。
Bash可以用>或>>重定向标准输出,用<重定向标准输入。
将输出写入文件
用 > 把进程的标准输出流重定向到文件中。
将输出追加到文件
用 >>把命令输出附加到文件中
将输入源改变成别的地方
用 <把命令输输入方式改变成别的
把输入输出和重定向混合使用。
2>把标准错误流重定向到文件中。
2>&1或>&把标准错误流与标准输出流结合在一起。
2>&1的意思是,“把标准错误传送到标准输出要去的任何位置”。
用来重定向标准输入、标准输出和标准错误的总结
cmd < file 从file重定向标准输入
cmd > file 把标准输出重定向到file中,如果file存在的话,覆盖(损坏)它
cmd >> file 把标准输出重定向到file中,如果file存在,附加给它
cmd 2>file 把标准错误重定向到file,如果file 存在,覆盖(损坏)它
cmd 2>> file 把标准错误重定向到file中,如果file 存在,附加给他
cmd >file 2>&1 合并标准输出和标准错误,并且重定向到file中(可移植的语法)
cmd >& file 合并标准输出和标准错误,并且重定向到file中(方便的语法)
分割与管道
分割:
让用户在一个命令行中输入多个命令。通过使用“;”隔开命令。
适合把多个小命令连起来。
所谓的“管道”可以把一个进程的标准输出流与另一个进程的标准输入流连接起来。
bash用“|”在两个命令之间创建管道。
一个命令的输出(标准输出)被直接“用管道输送”到另一个命令的输入(标准输入)中,从而构成了 Linux所谓的管道(pipe)。
常和管道协作的命令
more/less
find
xargs
grep
sort
uniq
- more/less
常和管道协作的命令 - find
find命令选项
-name 按照文件名查找文件
-perm 按照权限查找文件
-user/-group 按照用户/组查找文件
-mtime 按照修改时间查找文件
-type 按照类型查找文件
-a/-o 与and/或or
-depth 先查当前目录再查子目录
常和管道协作的命令 – grep
grep命令用于搜索pattern参数指定的内容,并将匹配的行写入标准输出。
还有egrep和fgrep两个命令。
egrep可以使用扩展的正则表达式
fgrep没有元字符与普通字符的区别
grep egrep用别名加了--color之后才好理解。
grep, egrep, fgrep - print lines matching a pattern
-r 递归
-v 反取
-i 忽略大小写
-n 显示行号
-c 计数
-w 匹配一个词
-l 只给出匹配的文件名
-L 列出不匹配的文件名
-o 只列出匹配的内容
grep中使用 - POSIX字符类
[:alnum:]文字数字字符 [:alpha:]文字字符
[:digit:]数字字符 [:upper:]大写字符
[:lower:]小写字符 [:cntrl:]控制字符
[:punct:]标点符号 [:print:]非空字符(包括空格)
[:space:]所有空白字符(新行,空格,制表符)
[:graph:]非空字符(非空格、控制字符)
[:xdigit:]十六进制数字(0-9,a-f,A-F)
常和管道协作的命令 - sort
sort - sort lines of text files
-n 按数字排序
-r 反序排序
-o 结果输出到文件
-t 分隔符
-k 关键字
常和管道协作的命令 - uniq
uniq - report or omit repeated lines
-c 每行出现的次数
-d 仅显示重复行
-u 仅显示不重复行
-i 忽略大小写
-f N 跳过前面N个部分
-s N 跳过前面N个字符
子shell与&& ||
&&和||是shell script中的判断,常在安装软件和判断输入时使用。
&&的含义:逻辑与。左边的命令执行成功返回真(0)后,右边的命令才能被执行。
||的含义:逻辑或。左边的命令执行失败返回假(1)后,右边的命令才能被执行。
什么是Shell scripts
Shell scripts就是字面上的意思shell +script,就是对shell写的脚本。
脚本是介于程序设计语言与命令之间的,形式上和功能上更进阶前者,但是并不是用户程序开发,也没有严格复杂的语法规则,无需编译。
这个程序是纯文本文件的,将一些shell的语法和指令(包括外包指令)写在里面,搭配正则表达式、管道或别的功能实现我们想要的处理目的。
关于文件类型的判断,如:test -e filename
-e 是否存在
-f 是否为文件
-d 是否为目录
-b 是否为block device
-c 是否为character device
-S 是否为socket文件
-p 是否为pipe文件
-L 是否为连接
关于文件权限的判断,如:test -r filename
-r 文件是否可读
-w 文件是否可写
-x 文件是否可执行
-u 文件是否有SUID
-g 文件是否有SGID
-k 文件是否有Sticky bit
-s 文件是否非空
两个文件之间的比较,如:test file1 -nt file2
-nt file1是否比file2新
-ot file1是否比file2旧
-ef file1是否和file2是同一个文件
两个整数之间的判断,如:test n1 -eq n2
-eq 两个数相等
-ne 两个数不等
-gt n1大于n2
-lt n1小于n2
-ge n1大于等于n2
-le n1小于等于n2
判断字符串数据
est -z string 字符串是否为0 为空返回true
test -n string 字符串是否非0 为空返回false
test str1 = str2 str1是否等于str2 相等返回true
test str1 != str2 str1是否不等于str2 相等返回false
其他判断,如:test -r filename -a -x filename
-a 两个状况同时成立 and与
-o 两个状况任何一个成立 or或
! 反
条件测试、循环分支
if条件语句,格式 if [ condition ]
then
command
fi
if [ condition ];then
command1
else
command2
fi
if [ condition1 ];then
command1
elif [ condition2 ];then
command2
else
command3
fi
for循环
格式:for NAME in [ LIST ]; do COMMANDS;
done
LIST用法
直接写 例如:1 2 3
大括号 例如:{1..5}
文件名 例如:/etc/*.conf
命令结果 例如:find /etc/ -name “*.conf”
C语言风格 例如:for (( i=0;i<=5 i=i+2 ))
i++也可以
while循环
格式:while CONTROL-COMMAND; do
CONSEQUENT-COMMANDS; done
while循环
例子:检查进程是否在运行
until循环
格式:until TEST-COMMAND; do
CONSEQUENT-COMMANDS; done
case
格式:case EXPRESSION in
CASE1) COMMAND-
LIST;; CASE2) COMMAND-LIST;;
... CASEN)
COMMAND-LIST;;
esac
正则表达式
概念
正则表达式是指用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。就是用某种模式去匹配一类字符串的一个公式。
基本元字符集
.点 匹配任意单个字符。如:rat、rut、r t。
^ 匹配一行的开始。
$ 匹配一行的结尾。
* 匹配0个或多个*前面的字符。
+ 匹配1个或多个+前面的字符。
? 匹配0个或1个?之前的字符。
\ 转义
[] 匹配括号中的任何一个字符。如:[abd]、[0-9]。
[^] 匹配不在括号中的,表示排除。如:[^abd]。
\< 匹配词的开始。
\> 匹配次的结尾。如:\<the\>。
() 分组。将匹配这个表达式的字符保存到一个临时区域
(最多保存9个),它们可以用\1到\9来引用。
| 或。例如:(him|her)。
{m} 前面的表达式重复m次。如:"\w{2}"相当于 "\w\w"。
{m,n} 表达式至少重复m次,做多重复n次。如:"ba{1,3}"匹配"ba"或"baa"或"baaa"。
{m,} 表达式至少重复m次。
\w 任意一个字母或数字或下划线。
\d 任意一个数字。
\s 空格、制表符、换页符、空白符中的任意一个。
\b 匹配一个单词的边界。如: ".\b." 在匹配 "@@@abc" 时匹配到的内容是:"@a"。
正则表达式语法支持
命令或
环境 . [] ^ $ \( \) \{ \} ? + | ()
vi X X X X X
awk X X X X X X X X
sed X X X X X X
grep X X X X X X
egrep X X X X X X X X X
perl X X X X X X X X X
sed
sed是stream editor的缩写。是一个非交互式上下文编辑器。sed默认不对文件做操作只输出而已。
使用情况:
编辑对交互式编辑器而言太大的文件。在编辑命令太复杂而难于在交互模式下操作的文件。
sed工作模式
sed编辑器逐行处理文件(或输入),并将输出结果发送到屏幕。sed把当前正在处理的行保存在一个临时缓冲区中,这个缓冲区称为模式空间或临时缓冲。Sed处理完模式空间中的行后(即在该行上执行完sed命令后),就把该行发送到屏幕上(除非之前又命令删除这一行或取消打印操作)。sed每处理完一行就将其从模式空间中删除,然后将下一行读入空间,进行处理和显示。处理完输入文件的最后一行后,sed便结束运行。sed把每一行都存在临时缓冲区中,对这个副本进行编辑,所以不会修改或破坏源文件。
语法:
sed [options] '{command}' [filename]
sed中的正则
^ 行的开始
$ 行的结尾
. 一个字符
* 0个或多个前一个字符
[] 方括号中的所有字符
{} 重复次数
() 组
/./ 匹配至少有一个字符的行
/../ 匹配至少有两个字符的行
/^#/ 匹配用#开头的行
/^$/ 匹配空行
/}$/ 匹配用}结尾的行(没有空格在后面)
/} *$/ 匹配用}结尾的行(可以有空格在后面)
/[abc]/ 匹配小写的a或b或c
/^[^abc]/ 匹配开头不是小写的a或b或c
awk
awk是一种有力的文本处理工具。是各种现有环境中功能最强大的数据处理引擎之一。
awk的语法与调用方式:
命令方式
awk ‘PATTERN{ACTION}' file
print $1
如-F: awk -F: '{print $1,$3}' file