zoukankan      html  css  js  c++  java
  • 02 bashshell介绍使用

    1.什么是Bash shell(壳)

    Bash Shell是一个命令解释器,它在操作系统的最外层,负责用户程序与内核进行交互操作的一种接口,将用户输入的命令翻译给操作系统,并将处理后的结果输出至屏幕。

    通过xshell连接,就是打开了一个bash程序的窗口,不能点鼠标,只能输入命令

    当我们使用远程连接工具连接linux服务,系统则会给打开一个默认的shell,我们可在这个界面执行命令、比如:获取系统当前时间,创建一个用户等等…

    image-20200816223737732

    2.Bash Shell能干什么?

    使用Shell实现对Linux系统的大部分管理,例如:
    1.文件管理(文件创建,移动,复制,删除,编辑…)
    2.权限管理(不同用户不通权限)
    3.用户管理(创建,删除….)
    4.磁盘管理(挂载)
    5.网络管理
    6.软件管理
    .等等.

    3.平时我们如何使用Shell呢?

    输入命令 –> 效率低 –>适合少量的工作
    Shell Script –> 效率高–>适合复杂重复性的工作
    例如:创建100个用户,单纯输入命令需要执行100次,而Shell脚本只需要几行命令即可完成100个用户的创建

    vim test.sh
    for i in {1..100}
    do
     useradd test$i
     echo "create test$i"
    done
    
    bash test.sh
    

    4.Shell提示符

    # $ = 普通用户, # = root用户(超级管理员)
    ### [root@lqz ~]# 
    # root:当前登录用户
    # @ :没有意义
    # lqz:主机名称,如果很长会显示不全,通过hostname查看
    # ~:当前用户所在家目录
    # #:通常指超级管理员
    # $:普通用户
    [root@lqz ~]# whoami
    root
    
    [root@web01 ~]# useradd jack
    [root@web01 ~]# passwd jack
    Changing password for user jack.
    New password:
    BAD PASSWORD: The password is a palindrome
    Retype new password:
    passwd: all authentication tokens updated successfully.
    [root@web01 ~]# su jack
    [root@web01 ~]# cd root   提示没有权限
    

    5.Shell基础语法

    命令行bash shell, 为用户提供输入, 执行命令的界面

    #命令  选项  参数
    command [-options] [arguments]
    
    [root@lqz ~]# ls             #命令
    [root@lqz ~]# ls -a          #命令+选项
    [root@lqz ~]# ls -a /home/   #命令+选项+参数
    ls -a -l
    ls -la
    ls --all
    ls --list
    ls -c
    ls --color
    ls -a /tmp
    #命令: 整条shell命令的主体
    #选项: 用于调节命令的输出效果
        #以 “-”引导短格式选项(单个字符),例如“-l”
        #以“--”引导长格式选项(多个字符),例如“--color”
        #多个短格式选项可以写在一起,只用一个“-”引导,例如“-al”
    #参数: 命令操作的对象,如文件、目录名等
    # 选项和参数可以出现位置调换,命令,选项,参数之间要至少有一个空格
    # 命令必须开头, 选项和参数位置可以发生变化
    

    2.Bash Shell基本特性

    1.命令补全

    当使用windows查找一个目录层级特别多的文件时,打开的效率会非常的慢,但如果使用linux查找一个目录层级特别多的文件时,可以通过tab键快速的补全

    PS: tab键可以实现命令补全,路径补全,在实际生产中tab补全往往是我们使用的最多的, 因为可以减少执行命令以及路径出错率。

    # yum provides ifconfig
    # yum install net-tools
    
    #查看ip时忘记具体了命令
    [root@lqz ~]# ifcon
    #按下tab键会自动补全
    [root@lqz ~]# ifconfig
    
    #按一下tab键没有反应, 按两下tab键列出所有if开头的命令
    [root@lqz ~]# if
    if         ifconfig   ifenslave  ifrename
    ifcfg      ifdown     ifnames    ifup
    
    #linux目录较深,经常使用tab键进行补全, 如果路径出错是没有办法补全(带斜线表示是目录(window叫文件夹))
    [root@lqz ~]# ls /etc/sysconfig/network-scripts/
    
    # 安装选项补全
    yum install bash-comple*
    yum install bash-completion 
    # ls -- Tab建,空格上下翻
    

    2.命令快捷键,快捷键可以帮助我们大大提升工作效率

    Ctrl + a    #光标跳转至正在输入的命令行的首部
    Ctrl + e    #光标跳转至正在输入的命令行的尾部
    Ctrl + c    #终止前台运行的程序
    Ctrl + d    #在shell中,ctrl-d表示推出当前shell。
    Ctrl + z    #将任务暂停,挂至后台
    Ctrl + l    #清屏,和clear命令等效。
    Ctrl + k    #删除从光标到行末的所有字符
    Ctrl + u    #删除从光标到行首的所有字符
    Ctrl + r    #搜索历史命令, 利用关键字,Tab建选中
    Ctrl + w    #按单词或空格进行向前删除
    Ctrl + 左右建 #按单词或空格进行向前向后跳
    
    #在命令行前加面加 "#" 则该命令不会被执行
    

    3.历史命令History, 追溯之前发生情况

    -w 保存命令历史到历史文件
    -c 清空命令历史记录, 不会情况文件
    -d 删除命令历史的第 N 条行

    #1.使用双 !! 可执行上一条执行过的命令
    [root@lqz ~]# ls
    lqz.com
    [root@lqz ~]# !!
    ls
    lqz.com
    
    #2.输入!6, 执行history命令历史中第 6 行命令
    [root@lqz ~]# !6
    touch lqz.com
    
    #使用!cat, 调用history命令历史最近一次执行过的cat命令
    [root@lqz ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
    [root@lqz ~]# !cat  # 最近一次
    cat /etc/sysconfig/network-scripts/ifcfg-eth0
    
    [root@lqz ~]# ls /etc/passwd
    #调用上一条命令的最后参数或选项, 按下ESC松开, 然后按下 "."
    [root@lqz ~]# cat
    [root@lqz ~]# cat /etc/passwd
    #第二种方式, 输入!$
    [root@lqz ~]# ls !$
    ls /etc/passwd
    /etc/passwd
    
    # history -d 100  删除第100条历史记录
    # history -c      清空记录(保存到文件中的还有)
    # history -w      保存历史集合,保存到当前用户的家目录 .bash_history
    # > .bash_history  清空文件的保存(操作完,不让别人看你执行的命令)
    

    3.命令别名

    命令别名将用户经常使用的复杂命令简单化, 可以用"alias 别名名称=命令"命令创建属于自己的命令别名, 若要取消一个命令别名,则是用unalias 别名名称命令。

    #1.定义临时别名, wk为查看eth0网卡别名
    [root@lqz ~]# alias wk='ifconfig'
    # alias 查看一下是否成功,发现系统内置了很多
    [root@lqz ~]# wk
    # 取消别名(都是临时的)
    [root@lqz ~]# unalias wk 
    
    #2.如果定义命令本身, 会执行什么?
    [root@lqz ~]# alias ifconfig='ifconfig eth0'
    #绝对路径执行, 调用命令本身
    [root@lqz ~]# /sbin/ifconfig
    #通过转义字符, 调用命令本身
    [root@WebServer ~]# ifconfig
    
    #3.取消别名
    [root@lqz ~]# unalias ifconfig
    
    #4.永久生效,/etc/bashrc
    [root@lqz ~]# echo "alias ifconfig='ifconfig eth0'" >> /etc/bashrc
    

    3.Bash Shell获取帮助

    1.命令 –help帮助

    [root@lqz ~]# ls --help
    用法: ls [选项]...[文件]...
    
    #ls 常见选项
    -a  #查看目录下的所有文件,包括隐藏文件
    -l  #以长格式的方式显示文件的详细内容
    -h  #以人性化的方式显示内容,配合-l使用
    -d  #只列出目录名,不列出目录以下的内容
    -t  #按修改时间进行排序
    -i  #显示文件的inode(该文件在该分区的一个编号)
    
    [root@lqz ~]# date --help
    Usage: date [OPTION]... [+FORMAT]
      or:  date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]
      
    [root@lqz ~]# date +%F   #查看日期
    2019-03-28
    [root@lqz ~]# date -s 12:00  #修改时间
    
    #时间不是用来查看,而是有其他的用途
    [root@web01 ~]# touch `date +%F`_file.txt
    [root@web01 ~]# ls
    2019-03-28_file.txt
    

    2.命令 man手册

    # man ls    #查看ls命令的手册
    

    3.linux命令大全url传送门
    linux命令大全
    linux命令手册

    4.Bash Shell命令流程

    1.当我们执行一个命令, 整个命令执行流程如下:

    1. 判断命令是否通过绝对路径执行
    2. 判断命令是否存在alias别名
    3. 判断用户输入的是内部命令还是外部命令
    4. Bash内部命令直接执行,外部命令检测是否存在缓存
    5. 通过PATH路径查找命令,有执行,无报错

    2.什么是内部命令,什么是外部命令

    内部命令: shell程序自带的命令。
    外部命令: 在系统PATH变量的某个路径下的可执行程序。

    3.如何检查用户输入的命令是内部命令还是外部命令

    #cd命令属于shell内部命令
    [root@linux-node1 ~]# type -a cd
    cd is a shell builtin
    cd is /usr/bin/cd
    
    #ping属于外部命令, 同时会打印当前命令路径
    [root@lqz ~]# type -a  ping
    ping is /bin/ping
    

    4.如果是外置命令,Bash可以通过查找PATH变量,获取该命令的绝对路径。

    #打印当前环境变量目录
    [root@lqz ~]# echo $PATH
    /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
    

    PS: PATH由多个路径组成,每个路径值之间用冒号间隔,对这些路径的增加和删除操作都将影响到Bash解释器对Linux命令的查找

    5.如果是外置命令还会涉及到一个内存缓存,也就是说,当我们出现重复执行相同的命令,会通过缓存调取执行,也就意味着不会搜索PATH路径。

    #表缓存命令所在位置
    [root@lqz ~]# hash
    hits    command
       1    /usr/bin/tty
       3    /sbin/ifconfig
    
    #已缓存命令,如果移动位置会导致无法找到该命令
    [root@lqz ~]# mv /sbin/ifconfig /bin/
    [root@lqz ~]# ifconfig
    -bash: /sbin/ifconfig: No such file or directory
    
    #删除缓存过的ifconfig命令, 即可执行
    [root@lqz ~]# hash -d ifconfig
    [root@lqz ~]# ifconfig
    
    #当然可以清空缓存表
    [root@lqz ~]# hash -r
    
    #注意: 命令缓存hash需要注意如下情况:
    1.只要执行外部命令1次就会对该命令进行缓存
    2.如果将命令移动了位置,该如何执行
        a.使用绝对路径执行
        b.删除hash表的缓存指令
    

    6.命令执行流程总结: 当我们执行了一个ping命令之后, 整个命令执行的流程步骤如下:

    1. 检查执行的命令是否使用的是绝对路径执行的。
    2. 检查ping命令是否存在alias别名
    3. 检查ping命令是内部命令还是外部命令
    4. 如果是内部命令Bash直接执行,如果是外部命令,首先检查Hash缓存,存在则直接调取
    5. 如果该命令不存在Hash缓存,则通过PATH路径进行逐行查找该命令所在的位置
    6. 如果PATH路径没有查找到该命令所在的路径,则返回错误码。command not found
  • 相关阅读:
    Django对静态文件的处理——部署阶段
    使用Django来处理对于静态文件的请求
    Django1.7如何配置静态资源访问
    Spring WebSocket中403错误解决
    FastJSON JSONObject 字段排序 Feature.OrderedField
    国际化(i18n) 各国语言缩写
    【转】java.io.Closeable接口
    【转】spring bean 卸载
    This content should also be served over HTTPS
    Failed to close the ServletOutputStream connection cleanly, Broken pipe
  • 原文地址:https://www.cnblogs.com/bailongcaptain/p/13519755.html
Copyright © 2011-2022 走看看