[8] Shell 基础知识
2017-07-01 00:27
176 查看
[8] Shell 基础知识
8.1 shell介绍
提供使用者使用界面”的软件(命令解析器,提供用户和机器之间的交互,支持特定语法,比如逻辑判断、循环,centos7默认shell为bash(Bourne Again Shell)。除了bash之外还有zsh、ksh8.2 命令历史
命令历史文件[root@localhost ~]# ls .bash_history
历史命令最大保存1000条
[root@localhost ~]# echo $HISTSIZE 1000
清空命令历史
[root@localhost ~]# history -c 清空内存中命令历史,但不会清空命令历史文件.bash_history
前输入的命令历史,不会立刻保存到命令历史文件中,而是先保存在内存中,只有退出当前终端时才会将内存命令历史写到文件中
更改最大命令历史
[root@localhost ~]# vim /etc/profile 搜索HISTSIZE关键字,更改值为5000 [root@localhost ~]# source /etc/profile [root@localhost ~]# echo $HISTSIZE 5000
添加命令历史修改时间
新建一个环境变量,用来输出时间格式
[root@localhost ~]# HISTTIMEFORMAT="%Y/%m/%d %H:%M:%S " [root@localhost ~]# echo $HISTTIMEFORMAT %Y/%m/%d %H:%M:%S [root@localhost ~]# history 1 2017/06/29 00:49:11 vim /etc/profile 2 2017/06/29 00:49:21 [root@localhost ~]# vim /etc/profile 3 2017/06/29 00:50:26 vim /etc/profile 4 2017/06/29 00:51:05 source /etc/profile 5 2017/06/29 00:51:16 echo $HISTSIZE 6 2017/06/29 00:51:21 [root@localhost ~]# source /etc/profile 7 2017/06/29 00:51:21 [root@localhost ~]# echo $HISTSIZE 8 2017/06/29 00:54:52 HISTTIMEFORMAT="%Y/%m/%d %H:%M:%S " 9 2017/06/29 00:55:06 echo $HISTTIMEFORMAT 10 2017/06/29 00:55:21 history
上述方法只在上前终端有效,下面方法可全局生效
将$HISTTIMEFORMAT="%Y/%m/%d %H:%M:%S "写进/etc/profie中,并生效该文件
设置命令历史文件特殊权限,防止被删除
[root@localhost ~]# chattr +a .bash_history
此时不设置最大保存命令数量,该文件也不会被删除
其他历史用法
!! 表运行history文件中最后一条命令 !n n为historyr命令显示内容的序列号,如!24,运行history命令历史中第24条命令 !word 运行history命令中最近的关键词的命令
8.3 命令补全和别名
tab补全命令、文件路径 centos7中支持参数补全,操作如下: [root@localhost ~]# yum install -y bash-completion 设置别名:alias 别名='具体命令' 取消别名:unalis 别名
8.4 通配符
* 通配零个或无穷多任意字符 ? 通配一个任意字符 + 通配一个或多个任意字符 [0-9] 或 [a-z] 范围内,任选其一,或者 {1,2} 范围内,人员其一,或1,或2
8.5 输入输出重定向
输出
echo "123" > 1.txt 将123输入到1.txt文件中,会覆盖原1.txt数据 echo "123" >> 1.txt 将123追加到1.txt文件中,不会覆盖原1.txt数据 2> 错误重定向,将屏幕中错误信息重定向至文件中 2>> 追加错误重定向,将屏幕中错误信息追加重定向至文件中 >+2> == &> 将错误和正确的信息重定向到文件中 >+2>> == &>> 将错误和正确的信息追加重定向到文件中
将正确和错误输出区分开
[root@localhost ~]# ls [1-9].txt 222.txt > 1.txt 2> 2.txt
输入
用法:[命令]<文件,将后面的文件作为前面命令的参数输入 [root@localhost ~]# wc -l < 2.txt 2
扩展
shell 1>&2 2>&1 &>filename重定向的含义和区别
8.6 管道符和作业控制
| 管道符将一个命令的输出变为另一个命令的输入
[root@localhost ~]# ls | wc -l 25 [root@localhost ~]# find / -name "*.conf" |wc -l 721 [root@localhost ~]# yum list |grep vim
作业控制
ctrl+z 暂停一个命令 jobs 查看当前终端后台运行或者暂停的任务,但可以查看到该任务进程 fg+n 恢复暂停的任务,放置前台运行,n为jobs命令查询到的id号 bg+n 把任务放到后台运行,n为jobs命令查询到的id号 [root@localhost ~]# vmstat 1 procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 1 0 0 1298764 1112 387736 0 0 108 19 54 74 0 0 98 2 0 0 0 0 1298748 1112 387736 0 0 0 0 39 46 0 0 100 0 0 ^Z [1]+ 已停止 vmstat 1 [root@localhost ~]# bg [root@localhost ~]# jobs [1]+ 运行中 vmstat 1 & 还有一种办法可以将任务快速丢到后台运行 [root@localhost ~]# sleep 100 & [1] 2561 [root@localhost ~]# jobs [1]+ 运行中 sleep 100 & ps aux 查看系统进程 kill -9 [pid] 结束进程
8.7 shell变量
env 查看系统预设全部环境变量set 查看系统预设的全部变量、用户自定义的变量
变量名规则
myname=temence 1.设定变量的格式为a=b,其中a为变量名,b为变量的内容,等号两边不能有空格; 2.变量名只能由英、数字以及下划线组成,而且不能以数字开头; 3.当变量内容带有特殊字符(如空格)时,需要加上单引号。 4.变量内容中本身带有单引号,这就需要用到双引号了。 myname="temence's" 5.变量内容中需要用到其他命令运行结果,使用反引号。 myname=`pwd` 6.变量内容可以累加其他变量的内容,需要加双引号 myname="$LOGNAME"temence
总结:使用双引号时不会取消掉里面出现的特殊字符的本身作用(比如$),而使用单引号则里面的特殊字符全部失去它本身的作用。
查看当前终端
[root@localhost ~]# echo $SSH_TTY /dev/pts/1 [root@localhost ~]# w 01:46:21 up 1:35, 1 user, load average: 0.07, 0.03, 0.05 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root pts/1 192.168.1.33 00:40 5.00s 0.38s 0.00s w
进入当前shell子shell
[root@localhost ~]# bash 进入子shell [root@localhost ~]# pstree 显示树状结构,清楚地表达程序间的相互关系 [root@localhost ~]# exit 退出子shell
全局变量
默认当前新建的变量都只会在当前终端下生效,本地变量并非全局变量,很多时候需要将变量生效为全局变量。需要使用export,export其实就是声明一下这个变量的意思,让该shell的子shell也知道变量。如果export后面不加任何变量名,则它会声明所有的变量。export向下声明变量,不能向上声明变量
用法:export [变量名] [root@localhost ~]# ggg=temence 设置ggg变量 [root@localhost ~]# echo $ggg 显示变量ggg内容 temence [root@localhost ~]# bash 进入子shell [root@localhost ~]# echo $ggg 查看子shell中ggg变量值 [root@localhost ~]# exit exit [root@localhost ~]# export ggg 全局申明变量ggg [root@localhost ~]# bash 再次进入子shell [root@localhost ~]# echo $ggg 再次查看子shell中ggg变量值,此时可以看到全局变量ggg的值 temence
取消变量
用法:unset [变量名]
8.8 环境变量配置文件
/etc/profile 用户环境变量,交换、登陆后才能执行里面内容。预设了几个重要的变量,例如PATH,USER,LOGNAME,MAIL, INPUTRC,HOSTNAME,HISTSIZE,umask等等。 /etc/bashrc 用户不用登陆,执行shell就能生效。预设umask值以及PS1(echo $PS1)。 .bash_profile 定义了用户的个人化路径与环境变量的文件名称。每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次。 .bashrc 该文件包含专用于你的shell的bash信息,当登录时以及每次打开新的shell时,该文件被读取。例如你可以将用户自定义的alias或者自定义变量写到这个文件中。 .bash_history 记录命令历史。 .bash_logout 当退出shell时,会执行该文件。可以把一些清理的工作放到这个文件中。
PS1 环境变量
PS1是主提示符变量,也是默认提示符变量。定义命令行提示字符即可,最常用的需求就是显示登录的用户名、主目录、主机名
显示用户名,主机名和动态显示当前目录 [\u@\h \W]\$ 颜色显示用户名、主机名、当前目录 [root@localhost etc]# PS1='[\[\033[01;32m\]\u@\h\[\033[00m\] \[\033[01;36m\]\W\[\033[00m\]]\$ ' PS1常用参数如下: /d 代表日期,格式为weekday month date,例如:"Mon Aug 1" /H 完整的主机名称。例如:我的机器名称为:fc4.linux,则这个名称就是fc4.linux /h 仅取主机的第一个名字,如上例,则为fc4,.linux则被省略 /t 显示时间为24小时格式,如:HH:MM:SS /T 显示时间为12小时格式 /A 显示时间为24小时格式:HH:MM /u 当前用户的账号名称 /v BASH的版本信息 /w 完整的工作目录名称。家目录会以 ~代替 /W 利用basename取得工作目录名称,所以只会列出最后一个目录 /# 下达的第几个命令 /$ 提示字符,如果是root时,提示符为:# ,普通用户则为:$ /[ 字符"[" /] 字符"]" /! 命令行动态统计历史命令次数
PS2 环境变量
PS2是副提示符变量,默认值是 > ,一般使用于命令行里较长命令的换行提示信息。如进入mysql提示信息
8.9 cut命令
shell特殊符号* 代表任意个字符 ? 代表任意一个字符 # 注释字符 \ 脱意字符 | 管道符 $ 变量前缀 !$ 在一行中运行两个或两个以上的命令,在命令之间加一个; ; shell命令行中表示上一条命令,正则里面表示行尾 ~ 用户家目录,正则表达式中表示匹配符 & 放到命令后面,把命令丢到后台 > 输出重定向 >> 追加重定向 < 输入重定向 2> 错误重定向 2>> 错误追加重定向 [ ] 中间为字符组合,代表中间字符中的任意一个; 也可以,if判断语句[ -d dir ]判断目录是否存在 shell中的连接符 (1) command1 ; command2 和 不管command1是否执行成功都会执行command2 (2) command1 && command2 并且 只有command1执行成功后,command2才会执行 (3) command1 || command2 或 command1和command2中只会执行一条命令。1执行,2不执行,2执行,1不执行。
cut 命令
语法: cut -d "分隔字符" [-cf] n 这里的n是正整数 -d 指定分隔符,不用引号也可以 -f 指定第几段 -c 后面只有一个数字表示截取第几个字符,后面跟一个数字区域n1-n10,表示截取从几到几,也可以n1,n3,n5 ,表示截取第一,三,五字符。-c参数不能和-d参数同时使用 [root@localhost /]# cat /etc/passwd |head -n2 root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin [root@localhost /]# cat /etc/passwd |head -n2 | cut -d ":" -f 1-4 root:x:0:0 bin:x:1:1 [root@localhost /]# cat /etc/passwd |head -n2 | cut -c 1-10 root:x:0:0 bin:x:1:1:
8.10 sort\wc\uniq命令
sort 排序语法: sort [-t 分隔符] [-kn1,n2] [-nru] 这里的n1<n2 -t : 指定分隔符,作用跟cut的-d一个意思 -n:使用纯数字排序,字幕和特殊符号被识别为0 -r:反向排序 -u:去重复 当使用-un参数时,sort会把文档中的字母看成0。 -kn1,n2:由n1区间排序到n2区间,可以只写-kn1,即对n1字段排序不加任何参数,则按照ASCII码升序排序
uniq 去重复命令
比sort -u多一个功能,可以计算重复的行数
使用uniq 的前提是需要先给文件排序
-c:统计重复的行数,并把行数写在前面 sort testb.txt |uniq -c
wc命令
-l 统计行数,后面可以跟多个文件,算总行数 -w 统计单词个数,以空格为分隔符 -m 统计字符个数
8.11 tee\tr\split命令
tee 双重输出类似与重定向,但是比重定向多了一个功能,在把文件写入后面所跟的文件,还显示在屏幕上。常用于管道符|后
-a 可以在文件中追加内容 [root@localhost ~]# echo "aa" |tee test.txt aa [root@localhost ~]# cat test.txt aa [root@localhost ~]# echo "bb" > test.txt [root@localhost ~]# cat test.txt bb 清空一个文件内容,而不删除文件 [root@localhost ~]# > test.txt [root@localhost ~]# cat test.txt
tr 替换字符
-d:删除某个字符,-d后面跟要删除的字符 -s:把重复的字符去掉,后面再跟一个字符把重复的字符替换成后面跟的字符 替换大小写 tr '[a-z]' '[A-Z]' [root@localhost ~]# echo "temence" |tr "temence" "Temence" Temence
split 切割文件
-b:依据大小来分割文档,默认单位为byte -l:依据行数来分割文档 文件后面可以指定切割后的文件名 split -b500 passwd 123
相关文章推荐
- Linux下Shell基础知识深入浅出
- shell脚本的基础知识1:基本脚本的编译
- Linux操作系统Shell基础知识
- shell编程基础知识
- linux变量及shell基础知识
- Linux下Shell基础知识简介
- shell基础知识(3)
- shell基础知识
- Shell 基础知识
- shell基础知识
- Linux下Shell基础知识简介
- 巩固shell基础知识
- SHELL脚本的基础知识5——显示数据
- shell基础知识
- shell基础知识
- SHELL脚本的基础知识3——更多结构化命令
- [shell]shell编程基础知识总结
- Linux.Shell编程基础知识三
- shell基础知识
- shell基础知识(2)--其他参数