0402 第十次课:shell基础(上)

shell基础上

1、shell介绍

shell是一个命令解释器,它在操做系统的最外层,负责直接与用户对话,把用户的输入解释给操做系统,并处理各类各样的操做系统的输出结果,输出到屏幕返回给用户。这种对话方式能够是交互的方式(从键盘输入命令,能够当即获得shell的回应),或非交互(脚本)的方式。换句话说,Shell是一个命令行解释器,它为用户提供一个像Linux内核发送请求以便运行程序的界面系统级程序,用户能够用Shell来启动,挂起,中止甚至是编写一些程序。   Shell仍是一个功能至关请打的编程语言,易编写,易调试,灵活性较强。Shell是解释执行的脚本语言,在Shell中能够直接调用Linux系统命令。html

  • 每一个用户均可以有本身特定的shellshell

  • CentOS7默认shell为bash(Bourne Agin Shell)编程

  • 还有zsh、ksh等,这shell默认是不安装的,使用须要进行安装centos

  • shell支持特定语法,好比逻辑判断、循环(if for whell)bash

2、历史命令

  • 命令历史查查看编程语言

    使用过的命令历史存放在用户家目录下的.bash_history文件中,能够经过history命令查看命令使用历史测试

  • 历史命令存储centos7

    1.能够经过:echo $HISTSIZE 查看多能够存储多少条历史命令,默认为:1000条。操作系统

    2.history -c 能够清除历史命令,可是不能清除.bash_history文件中的历史命令.net

    3.历史记录只有退出终端的时候才会保存到.bash_history文件中,非正常关闭终端使用过的命令不会保存。

    4.环境变量HISTSIZE的大小能够在/etc/profile中修改HISTSIZE参数,改完source或者退出终端从新登陆生效

  • 命令历史格式修改

    一、修改前

    二、临时修改

    HISTTIMEFORMAT="%Y/%m/%d %H:%M"

    三、永久修改

    /etc/profile中加入:

    HISTTIMEFORMAT="%Y/%m/%d %H:%M "

  • 命令永久保存

    若是想把命令永久保存,不想别人删除,那能够把.bash_history文件加上a权限,使文件只能添加不能删除。

    chattr -a ~/.bash_history

  • 命令历史快捷键

    • !!: 执行最后一次执行的命令

    • !+ 数字: 执行命令历史中对应数字的命令

    • !+xx: 执行以xx开头的最后一条命令

3、命令补全

  • centos7中参数补全

    centos6中只能tab进行命令补全,centos7中能够支持参数补全。

    默然是不支持的须要安装bash-completion,ctrl+d退出,从新登陆后生效。

    安装: yum -y install bash-completion

    重启:reboot

    完成后测试:

  • 命令别名

    若是以为有些命令比较长和繁琐,可使用给这些命令起一个别名,起别名的命令:alias

    用法:alias 别名='具体命令'

  • 查看已有的别名

    命令:alias

  • 取消自定义的别名

    命令:unalias 别名

4、通配符

  • "*" :表示0或者多个任意字符

    如:*.txt 列出全部以.txt结尾文件

  • ? : 一个任意字符

    如:?.txt 列出一个任意字符的.txt文件

  • 如:[123].txt 会列出1.txt 2.txt 3.txt

    它也能够支持字母

    示例:

    列出:1-9

    列出:1-9 和a-z

  • {} :列出花括号里面开头

    如:{}.txt: 列出花括号内开头带有.txt

    示例:

5、输出输入重定向

  • 输出重定向:

    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命令中进行统计行数

6、管道符和做业控制

  • 管道符

    就是把前一个命令输出结果传到后面的命令

    示例:把cat的输出结果传给wc进行统计

  • 做业控制

    做业控制:ctrl + z 能够暂停一个任务

    好比说正在vi编辑一个文件,能够ctrl + z暂停vi编辑,这时能够在控制台继续使用其它操做:

    若是想继续进行vi编辑可使用fg命令从新调用回来继续执行:

    有多个任务在暂停中,可使用jobs命令查看:

    多个暂停的任务时,指定任务恢复:

    fg id号 ,若是不指定id号那就是恢复最后一次运行的。

  • 暂停任务放到后台继续运行:

    以下图sleep 300 任务是暂停状态,咱们使用bg 命令把它丢到后台继续运行,再查看它的状态已经变为运行中

  • 在命令后面加入&也可使命令直接在后台执行

7、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 变量名

8、环境变量配置文件

  • 环境变量配置文件两个维度

    系统环境变量配置文件分两个维度:系统层次和用户层次

  • 系统层

    /etc/profile 用户登陆的时候会加载到

    /etc/bashrc 用户或系统执行shell脚本时候,会用调用这个文件里的一些配置

    通常不要编辑,若是须要全部用户使用的全局变量则修改/etc/profile

  • 用户层

    ~/.bashrc

    ~/.bash_profile

    ~/.bash_history 记录历史命令

    ~/.bash_logout 用户退出时作的一些操做,如:想退出时删除历史命令,把删除命令放入这个文件中便可。

  • 是环境变量生效

    source 配置文件

    或者 . 配置文件

  • PS1环境变量

      PS1是来定义系统提示符的系统变量,通常系统默认的形式是:[username@host 工做目录]$.

    root用户显示:

    普通用户:

    root是以#结尾,普通用户是$结尾。

    echo $PS1查看:

    修改:

    修改显示的绝对路径

    修改显示颜色

    PS1='\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;36m\]\w\[\033[00m\]\$'

  • ps2模式

    查看PS2模式:

9、直播课

  • profile只用用户登陆才会生效

  • bashrc用户不登陆也会生效

  • profile和bashrc的区别

  • echo显示颜色

  • source命令

    source 命令的另外一种写法是点符号,用法和 source 相同

    功能:使Shell读入指定的Shell程序文件并依次执行文件中的全部语句

  • source命令和exec的区别

经过三个脚本测试:

2.sh

#!/bin/bash

echo "children script PID is $$"

echo "now to children script."

export a=2

echo "in children, a=$a"

source.sh

#!/bin/bash
echo "fater script PID is $$"
echo "fater script, set a is 1"
export a=1
echo "it will source ./2.sh"
source ./2.sh
echo "now to father script."
echo "fater script, a is $a"

exec.sh

#!/bin/bash
echo "fater script PID is $$"
echo "fater script, set a is 1"
export a=1
echo "it will exec ./2.sh"
exec ./2.sh
echo "fater script, a is $a"

使用s是不会产生新的pid,souce脚本中的变量跟着进入到父脚本中。会把子脚本中的变量带出来

exec场景:记录日志

相关文章
相关标签/搜索