shell基础上
一、shell介绍
shell是一个命令解释器,它在操作系统的最外层,负责直接与用户对话,把用户的输入解释给操作系统,并处理各种各样的操作系统的输出结果,输出到屏幕返回给用户。这种对话方式可以是交互的方式(从键盘输入命令,可以立即得到shell的回应),或非交互(脚本)的方式。换句话说,Shell是一个命令行解释器,它为用户提供一个像Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动,挂起,停止甚至是编写一些程序。 Shell还是一个功能相当请打的编程语言,易编写,易调试,灵活性较强。Shell是解释执行的脚本语言,在Shell中可以直接调用Linux系统命令。
-
每个用户都可以有自己特定的shell
-
CentOS7默认shell为bash(Bourne Agin Shell)
-
还有zsh、ksh等,这shell默认是不安装的,使用需要进行安装
-
shell支持特定语法,比如逻辑判断、循环(if for whell)
二、历史命令
-
命令历史查查看
使用过的命令历史存放在用户家目录下的.bash_history文件中,可以通过history命令查看命令使用历史
-
历史命令存储
1.可以通过:echo $HISTSIZE 查看多可以存储多少条历史命令,默认为:1000条。
2.history -c 可以清除历史命令,但是不能清除.bash_history文件中的历史命令
3.历史记录只有退出终端的时候才会保存到.bash_history文件中,非正常关闭终端使用过的命令不会保存。
4.环境变量HISTSIZE的大小可以在/etc/profile中修改HISTSIZE参数,改完source或者退出终端重新登录生效
-
命令历史格式修改
1、修改前
2、临时修改
HISTTIMEFORMAT="%Y/%m/%d %H:%M"
3、永久修改
/etc/profile中加入:
HISTTIMEFORMAT="%Y/%m/%d %H:%M "
-
命令永久保存
如果想把命令永久保存,不想别人删除,那可以把.bash_history文件加上a权限,使文件只能添加不能删除。
chattr -a ~/.bash_history
-
命令历史快捷键
-
!!: 执行最后一次执行的命令
-
!+ 数字: 执行命令历史中对应数字的命令
-
!+xx: 执行以xx开头的最后一条命令
-
三、命令补全
-
centos7中参数补全
centos6中只能tab进行命令补全,centos7中可以支持参数补全。
默然是不支持的需要安装bash-completion,ctrl+d退出,重新登录后生效。
安装:
yum -y install bash-completion
重启:
reboot
完成后测试:
-
命令别名
如果觉得有些命令比较长和繁琐,可以使用给这些命令起一个别名,起别名的命令:alias
用法:alias 别名='具体命令'
-
查看已有的别名
命令:alias
-
取消自定义的别名
命令:unalias 别名
四、通配符
-
"*" :表示0或者多个任意字符
如:*.txt 列出所有以.txt结尾文件
-
? : 一个任意字符
如:?.txt 列出一个任意字符的.txt文件
-
如:[123].txt 会列出1.txt 2.txt 3.txt
它也可以支持字母
示例:
列出:1-9
列出:1-9 和a-z
-
{} :列出花括号里面开头
如:{}.txt: 列出花括号内开头带有.txt
示例:
五、输出输入重定向
-
输出重定向:
1.> :左边输出重定向到右边
如:cat 1.txt > 2.txt 会把1.txt的内容重定向到2.txt中
2.>>:左边输出追加到右边
如:at 1.txt >> 2.txt 会把1.txt的内容追加到2.txt中
3.2> :错误重定向
如:输入一个错误的命令,加上2> 它会把错误信息重定向到2.txt中。
4.2>>: 错误追加重定向
5.&> 是 > 和 2> 结合 ,会把正确和错误信息全部重定向。
-
输入重定向
把右边的文件输入到左边的命令中
如:把2.txt的内容输入到wc -l命令中进行统计行数
六、管道符和作业控制
-
管道符
就是把前一个命令输出结果传到后面的命令
示例:把cat的输出结果传给wc进行统计
-
作业控制
作业控制:ctrl + z 可以暂停一个任务
比如说正在vi编辑一个文件,可以ctrl + z暂停vi编辑,这时可以在控制台继续使用其它操作:
如果想继续进行vi编辑可以使用fg命令重新调用回来继续执行:
有多个任务在暂停中,可以使用jobs命令查看:
多个暂停的任务时,指定任务恢复:
fg id号 ,如果不指定id号那就是恢复最后一次运行的。
-
暂停任务放到后台继续运行:
如下图sleep 300 任务是暂停状态,我们使用bg 命令把它丢到后台继续运行,再查看它的状态已经变为运行中
-
在命令后面加入&也可以使命令直接在后台执行
七、shell变量
-
列出系统环境变量
env命令:列出系统预设的全部系统变量
set命令:set不仅可以显示系统预设的环境变量,还可以显示用户自定义的变量
-
自定义变量
-
自定义变量命名规则
-
a=b,a为变量名,b为值,等号两边不能有空格。
-
变量名只能由字母,数字以及下划线组成,而且不能以数字开头。
-
当变量值带有特殊字符时,需要加上单引号。
-
变量内容本身就带有单引号,这个时候需要加上双引号。
示例:
当变量值有特殊符号时需要使用单引号(''):
变量累加:
-
-
全局变量
当打开多个终端,在其中一个终端中设置一个环境变量,在另外一个终端中是查看不到的。
echo $SHH_TTY:可以通过此命令查看当前在哪个终端下。
终端1:
终端2:
-
pstree查看当前所在位置
如果当前shell中运行bash命令,则会进入一个新的shell中,这个shell是原来shell的子shell
我们可以用pstree命令来查看当前所在的位置(如果没安装则先安装:yum install -y psmisc)
-
exprot命令
以上这种情况是本地环境变量,只在当前终端下生效,如果想要变为全局变量则需要使用:exprot命令
示例:
另外一个终端查看:
再重新打开一个终端:
-
取消环境变量
unset 变量名
八、环境变量配置文件
-
环境变量配置文件两个维度
系统环境变量配置文件分两个维度:系统层次和用户层次
-
系统层
/etc/profile 用户登录的时候会加载到
/etc/bashrc 用户或系统执行shell脚本时候,会用调用这个文件里的一些配置
一般不要编辑,如果需要所有用户使用的全局变量则修改/etc/profile
-
用户层
~/.bashrc
~/.bash_profile
~/.bash_history 记录历史命令
~/.bash_logout 用户退出时做的一些操作,如:想退出时删除历史命令,把删除命令放入这个文件中即可。
-
是环境变量生效
source 配置文件
或者 . 配置文件
-
PS1环境变量
PS1是来定义系统提示符的系统变量,一般系统默认的形式是:[username 工作目录]$.
root用户显示:
普通用户:
root是以#结尾,普通用户是$结尾。
echo $PS1查看:
修改:
修改显示的绝对路径
修改显示颜色
PS1='\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;36m\]\w\[\033[00m\]\$'
-
ps2模式
查看PS2模式:
九、直播课
-
profile只用用户登录才会生效
-
bashrc用户不登录也会生效
-
source命令
source 命令的另一种写法是点符号,用法和 source 相同
功能:使Shell读入指定的Shell程序文件并依次执行文件中的所有语句
-
source命令和exec的区别
通过三个脚本测试:
2.sh
#!/bin/bashecho "children script PID is $$"echo "now to children script."export a=2echo "in children, a=$a"
source.sh
#!/bin/bashecho "fater script PID is $$"echo "fater script, set a is 1"export a=1echo "it will source ./2.sh"source ./2.shecho "now to father script."echo "fater script, a is $a"
exec.sh
#!/bin/bashecho "fater script PID is $$"echo "fater script, set a is 1"export a=1echo "it will exec ./2.sh"exec ./2.shecho "fater script, a is $a"
使用s是不会产生新的pid,souce脚本中的变量跟着进入到父脚本中。会把子脚本中的变量带出来
exec场景:记录日志