博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
0402 第十次课:shell基础(上)
阅读量:6471 次
发布时间:2019-06-23

本文共 3831 字,大约阅读时间需要 12 分钟。

hot3.png

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场景:记录日志

转载于:https://my.oschina.net/u/3755326/blog/3032770

你可能感兴趣的文章
copy strong weak assign的区别
查看>>
OpenCV 入门
查看>>
css 3D transform变换
查看>>
ele表格合并行之后的selection选中
查看>>
正则表达式分解剖析(一文悟透正则表达式)
查看>>
解决UILable标点符号居中的问题
查看>>
HTML5新特性教程
查看>>
SpringBoot 实战 (十七) | 整合 WebSocket 实现聊天室
查看>>
ImageOptim-无损图片压缩Mac版
查看>>
12 Go语言map底层浅析
查看>>
vue-resumer 项目中 element-ui 遇到的 textarea autosize 问题
查看>>
以主干开发作为持续交付的基础
查看>>
PHP扩展库PEAR被攻击,近半年下载者或被影响
查看>>
传统运维团队转型应该注意哪些问题?
查看>>
JavaScript函数(二)
查看>>
Airbnb改进部署管道安全性,规范部署顺序
查看>>
腾讯最大规模裁撤中层干部,让贤年轻人
查看>>
当我们谈性能的时候,我们实际上在谈什么?
查看>>
Spring Boot 2.0将会增强Actuator端点的特性
查看>>
i4o开源项目增强LINQ索引功能
查看>>