• 🍖Bash Shell 介绍


    引入

    1.什么是系统命令

    • Shell解释器对系统接口的封装
    命令控制的方法流程示例:
    	⛅应用程序-->系统命令/shell命令--->Shell解释器--->系统接口--->内核--->硬件
    	⛅系统命令/Shell命令--->Shell解释器--->系统接口--->内核--->硬件
    	⛅应用程序--->系统命令/Shell命令--->系统接口--->内核--->硬件
    

    2.为何要用系统命令

    • 为了使用计算机

    一.Bash Shell 是什么 ?

    • Xshell 是什么?

    它是一个远程执行命令的客户端程序, 对应的服务端程序 openssh-server (默认22端口)

    套接字客户端----------------网络----------------套接字服务端
      Xshell                                      openssh-server
    
    远程管理工具
    ⛅Mac: iTerm2
    	打开命令行终端
    	ssh root@服务器的IP地址
    ⛅Windows: Xshell
    	缓冲区设置: 控制内容显示的行数
    	上下翻页: shift + Pg Up
    			shift + Pg Dn
    
    • Shell是什么?

    ⛅第一层意思: shell代表的是解释器, 是对系统接口的封装, 即在系统接口外加了一层壳
    			shell只是一种称呼, 而Bash解释器才是具体的一种Shell
    ⛅第二层意思: Shell这门编程语言, (一堆命令及用法)
    			用Shell程序写出来的程序一般叫做脚本程序
    
    • posix (了解)

    全称 : "可移植性的操作系统接口"
    Linux系统支持 "posix", 它是一种规范
    Windows系统部分支持 "posix"
    作用: 在于提高应用程序在各种Unix操作系统环境之间的可以移植性
    
    • Bash

     Bash(GNU Bourne-Again Shell) 是许多Linux发行版的默认Shell.
    
    • shell是一个命令语言解释器, 在操作系统的最外层, 是用户(用户程序)与操作系统(Linux)内核的接口程序, 用户输入的每个命令都由shell先翻译再传给Linux内核, 并将处理后的结果输出至屏幕

    • 当我们使用远程链接工具连接Linux服务时, 系统会打开一个默认的shell, 我们可以在这个界面执行命令. 比如:获取当前时间, 创建一个用户, 对文件的增删改查等等.

    二.Bash Shell 能做什么?

    • 使用Shell可以实现Linux系统的大部分管理
    1.文件管理: 创建, 移动, 赋值, 删除, 编辑...
    2.权限管理: 不同用户的不同权限管理.
    3.用户管理: 创建以及删除用户.
    4.磁盘管理: 磁盘挂载.
    5.网络管理: IP的配置.
    6.软件管理: 下载及运行等等.
    

    三.Shell提示符

    "#" = root用户(管理员), "$" = 普通用户
    [root@shawn /]# whoami //查看当前用户
    root
    [root@shawn /]# useradd yanxi //创建一个用户
    [root@shawn /]# passwd yanxi  //设置yanxi的密码
    Changing password for user yanxi.
    New password:    #//设置密码
    BAD PASSWORD: it is WAY too short
    BAD PASSWORD: is too simple
    Retype new password:     #//确认密码
    passwd: all authentication tokens updated successfully.
    [root@shawn /]# su yanxi //切换到用户yanxi(超级用户切换普通用户不需要密码)
    [yanxi@shawn /]$   #//符号已变成普通用户符号
    [yanxi@shawn /]$ su   #//(普通用户切换到root用户需要密码)
    Password: 
    [root@shawn /]# //符号已变成root用户符号
    

    ps: 交互式与非交互式创建用户

    ⛅交互式
    	# useradd Shawn
    	# passwd Shawn
    	然后输入密码, 确认密码
    ⛅非交互式
    	# echo "123" | passwd Shawn --stdin(标准输出管道)
    	将打印的"123"这个结果放入管道"|"中,给"passwd"这个命令使用,一步到位
    

    四.Shell基础语法

    #   命令       选项       参数
    # comment  [-options]  [arguments]
    
    ⛅命令: 就是一个单词, 对应着一个功能/程序, 运行一条命令就启动了一个进程
    ⛅选项: 对命令的描述,用于调节命令的输出效果,控制命令的具体运行
        	以 “-”引导短格式选项(单个字符),例如“-l”
        	以“--”引导长格式选项(多个字符),例如“--color”
        	多个短格式选项可以写在一起,只用一个“-”引导,例如“-al”
    ⛅参数: 命令操作的对象,如文件、目录名等
    注意: 选项和参数可以出现位置调换,命令,选项,参数之间要至少有一个空格.而命令必须开头, 选项和参数位置可以发生变化
    
    #   命令       选项       参数
    # comment  [-options]  [arguments]
    
    [root@shawn /]# ls     #命令
     	//显示当前目录下的所有文件以及文件夹
    [root@shawn /]# ls -l  #命令+选项
    	//以列表的形式显示当前目录下的所有文件以及子文件夹
    [root@shawn /]# ls -l /home  #命令+选项+参数
     	//以列表的形式显示当前目录下的"home"目录的所有文件以及子文件夹
    
     // ls -a -l  (多个短格式)
     // ls -al    (多个短格式写在一起)
     // ls --all  (长格式)
     // --color   
    

    五.Tab命令补全

    • 在敲命令行时, 有些命令太长不好记, Tab键可以实现命令补全, 路径补全
    • 在实际的工作中Tab键非常用有作用, 因为可以提高执行效率, 减少出错率
    #当你忘记了一条命令的具体单词, 双击Tab键可查看你输入单词开头的所有命令
    [root@shawn ~]# if
    if         ifcfg      ifconfig   ifdown     ifenslave  ifstat     ifup       
    [root@shanw ~]# ifc
    ifcfg     ifconfig  
    [root@shawn ~]# ifco
    #这一步按Tab键直接补全了 ifconfig 命令
    [root@shawn ~]# ifconfig
    
    #在Linux中想要访问的目录较深, 经常的使用Tab键补全, 可以提高速度与容错率
    #如果路径出错是没有办法补全的
    [root@shawn ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33
    

    ps:更改主机名

    #通过修改文件来永久修改主机名
    [root@localhost ~]# vi /etc/hostname  
    
    #通过命令的方式也是永久修改(例外)
    [root@localhost ~]# hostnamectl set-hostname [想要的主机名]
    [root@localhost ~]# exit
    登出
    #重新登入即可
    

    六.Shell的两种使用

    1.命令:

    • 效率低, 适合少量的工作.

    2.脚本(Shell Script):

    • 效率高, 适合重复的大量的工作.
    例如:创建100个用户, 如果使用命令就需要执行一百次 useradd, 而脚本值需要几行就可以实现.
    [root@Shawn ~]# vim shell_script.sh  //创建一个脚本文件
    按 i //编辑模式
    for i in {1..100}
    do
    useradd user $i
    echo "create user$i"
    done
    
    按Esc  //退出编辑模式进入命令模式
    :wq
    [root@Shawn ~]# bash shell_script.sh  //执行
    

    七.shell命令行--快捷键

    使用shell快捷键能极大的提高工作效率

    1.编辑常用命令

    Ctrl + a: /移动到命令行首
    Ctrl + e: /移动到命令行尾
    Ctrl + f: /按照字符一个一个往右移
    Ctrl + b: /按照字符一个一个往左移
    Alt + f ://按单词往右边移动
    Alt + b ://按单词往左边移动
    Ctrl + 方向键: /按单词或空格左右跳
    Ctrl + u ://从光标处删除至命令行首
    Ctrl + k ://从光标处删除至命令行尾
    Ctrl + h ://删除光标前的字符
    Ctrl + d ://有命令字符的情况下删除光标后的字符, 没有字符是登出
    

    2.历史执行命令

    Ctrl + p://历史中的上一条命令
    Ctrl + n://历史中的下一条命令
    Ctrl + r://逆向搜索命令历史
    Ctrl + g://从历史搜索模式退出
    Alt + .://使用上一条命令的最后一个参数
    

    3.控制命令

    Ctrl + l://清屏(等同于clear命令)
    Ctrl + o://执行当前命令,并选择上一条命令
    Ctrl + s://阻止屏幕输出
    Ctrl + q://允许屏幕输出
    Ctrl + c://终止前台运行的程序
    Ctrl + z://将任务暂停,挂到后台
    Ctrl + d ://登出, 如果命令行有字符则是删除光标后的字符
    

    4. "!" 命令

    !!://执行上一条命令
    !vim://执行历史命令中最近的以 vim 开头的命令,如 !ls,!cat...
    !$://上一条命令的最后一个参数,[与 Alt + . 相同(在Xshell中用不了)]
    !$:p://打印输出 !$ 的内容
    !blah:p://仅打印输出,而不执行
    !*://上一条命令的所有参数
    !*:p://打印输出 !* 的内容
    ^blah://删除上一条命令中的 blah
    ^blah^foo://将上一条命令中的 blah 替换为 foo
    ^blah^foo^://将上一条命令中所有的 blah 都替换为 foo
    

    5.历史命令 "history"

    history       //查看历史命令
    history -d N  //删除第N条历史命令
    history -w    //保存历史命令到文件,保存到当前用户的家目录(.bash_history)
    history -c    //清空记录, 不会清空文件里的
    //如果想要清空所有你敲的命令就要到(.bash_history)文件里面去删除
    vi ~/.bash_history
    

    6.命令别名 "alias"

    • 将复杂的难记的命令简单化
    • "alias 别名=命令"
    • "\" : 取消特殊意义, 取消了别名的意义: \ls,
    • 取消别名 : "unalias 别名"
    [root@shawn ~]# which [命令]   #查看命令的完整路径
    [root@shawn ~]# alias hh='cd /home/shawn'
    [root@shawn ~]# hh
    [root@shawn shawn]# pwd
    /home/shawn
    [root@shawn shawn]# unalias hh  #取消别名
    [root@shawn shawn]# hh
    -bash: hh: 未找到命令
    #以上这些都是临时设置
    #要想永久设置: 将 "alias 别名='想要别名的命令'" 写入 "~/.bashrc"
    例子: "alias cat-ens32='cat /etc/sysconfig/network-scripts/ifcfg-ens32'"
    
    • 取消别名运行的方式
    which ls   //先查看命令的完整路径, 在使用完整路径来运行
    \ls        //反斜杠可以取消特殊意义, 取消ls的别名意义
    unalias    //直接取消别名
    

    7.查看帮助信息

    • man手册

    # man [命令]
    # man ls   #查看ls命令的手册
    
    一.按章节来查找
    常用的是 1 (命令用法), 5 (文本规范), 8 (系统管理命令)
    /usr/bin/passwd      #命令, 修改用户密码 ----man 1 [命令]
    /etc/passwd          #保存用户信息文件   ----man 5 [命令]
    /etc/exports 		#man exports       ----man 5 exports
    
    二.按关键字来检索 (适合记不住手册全名)
    man -k "_selinux"            //手册名或手册描述中包含关键字_selinux
    	这会从whatish数据库中去查找
    
    三.在所有章节中查询
    # man -a passwd
    # man -f passwd
    
    • --help

    用法: [命令] --help
    [root@shawn ~]# ls --help
    
    "ls"用法: ls [选项]...[文件]...
    "ls"常见选项:
    	-a		all, 查看目录下的所有文件, 包括隐藏文件
    	-l		长列表显示
    	-h		human 一人性化的方式显示出来
    	-d		只列出目录名, 不列出其他内容
    	-t		按修改时间排序
    	-r		逆序排列
    	-i		显示文件的inode号 (索引号)
    
    • 参考文档/配置模块文件

    • 官方手册

    • baidu 以及 google

    八.Bash Shell 命令执行流程

    1.什么是内部命令以及外部命令

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

    2.判断是内部命令还是外部命令

    //cd 为shell内部命令
    [root@shawn ~]# type -a cd
    cd id=s a shell builtin  //shell 内建
    cd is /bin/cd
    cd is /bin/usr/cd
    //ping 为外部命令, 同时打印出当前命令路径
    [root@shawn ~]# type -a ping
    ping is /bin/ping
    ping is /bin/usr/ping
    //hh 为 cd 的别名
    [root@shawn ~]# alias hh='cd'
    [root@shawn ~]# type -a hh
    hh is aliased to 'cd'  //hh 是 cd 的别名
    

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

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

    4.命令缓存: hash表

    • linux系统下会有一个hash表,当你刚开机时这个hash表为空,每当你执行过一条命令时,hash表会记录下这条命令的路径,就相当于缓存一样

    • 第一次执行命令shell解释器默认的会从PATH路径下寻找该命令的路径,当你第二次使用该命令时,shell解释器首先会查看hash表,没有该命令才会去PATH路径下寻找。

    • 作用: 大大提高命令的调用速率

    1.只要执行外部命令1次就会对该命令进行缓存
    2.如果将命令移动了位置,该如何执行
        a.使用绝对路径执行
        b.删除hash表的缓存指令
    //查找缓存命令所在的路径
    [root@shawn ~]# hash
    hits     command
       1      /sbin/ifconfig
       2      /bin/systemctl
       7      /bin/ping
     
    //移动已缓存的命令, 会造成命令无法执行
    [root@shawn ~]# ping baidu.com
    -bash: /bin/ping: No such file or directory
    
    //清除hash表里其中一条
    [root@shawn ~]# hash -d ping
     
    //清除hash表里全部缓存
    [root@shawn ~]# hash -r
    [root@shawn ~]# hash
    hash: hash table empty #显示为空
    

    5.命令查找优先级

    • 首先判断命令是否通过绝对路径
    • 判断命令是否有 alias 别名
    • 判断是否是复合命令(Compound Commands)
    • 判断是否是函数(function)
    • 判断用户输入的是内部命令还是外部命令
      • ​ 如果是Bash内部命令直接执行, 外部命令则检测是否存在hash缓存
    • 最后到PATH路径查找命令, 有就执行, 没有报错: command not found
    复合命令:例:
    # for((i=0;i<=3;i++))do echo 1213;done
    
    函数:例:
    # function func(){ echo 123; }
    {}左右两边有空格
    查看命令所在的位置:# which [命令]
    

    九.设置时间命令

    设置时间的方法有三种

    1.Linux的系统时间

    • 这里说的系统时间说的是Linux操作系统维护的时间
    查看时间
    # date
    以自己想要的格式查看时间
    # date "+%Y__%m__%d %H::%M::%S"  
    自己设置系统时间
    # date -s "2050-12-25 12:25:41"   
    

    2.硬件时间

    • 硬件时钟是指主机板上的时钟设备,也就是通常可在BIOS画面设定的时钟,硬件时间存放于CMOS中
    查看硬件时间
    # hwclock
    强制把系统时间写入硬件(cmos)中
    # hwclock -w
    "-s" 相反, 将硬件时间写入系统时间
    # hwclock -s
    

    3.NTP时间协调服务器

    • ntpdate命令是使用NTP协议来从网络同步时间的命令, NTP(Network Time Protocol) 网络时间协
    同步网络时间
    # ntpdate ntp1.aliyun.com
    查看时间是否更新了
    # date
    然后将其写入硬件时间把我们之前乱写的时间改回来
    # hwclock -w
    阿里云提供的 7 个NTP时间服务器(Internet时间同步服务器地址)
    ntp1. aliyun. com
    ntp2. aliyun. com
    ntp3. aliyun. com
    ntp4. aliyun. com
    ntp5. aliyun. com
    ntp6. aliyun. com
    ntp7. aliyun. com
    

    4.系统时间与硬件时间的关系

    这里说的是系统时间,是linux由操作系统维护的
    
    硬件时钟是指主机板上的时钟设备,也就是通常可在BIOS画面设定的时钟,硬件时间存放于CMOS中
    
    系统时钟则是指内核(kernel)中的时钟,当Linux启动时,Linux操作 系统将时间从CMOS中读到系统时间变量中
    
    之后系统时钟即独立运作, 所有Linux相关指令与函数都是读取系统时钟的设定
    
    linux系统设置硬件时钟时,提供两种时区选择,一种为本地时区, 此时硬件时间与系统时间相同
    
    另一种为UTC时区,此时硬件时间存的是UTC时间,系统初始化时会转换为本地时间后再设置为系统时钟的时间
    
    以后修改时间通过修改系统时间实现, 为了保持系统时间与CMOS时间的一致性,Linux每隔一段时间会
    将系统时间写入CMOS
    
    由于该同步是每隔一段时间(大约是11分钟) 进行的,在我们执行"date -s"后,如果马上重起机器,修改时间就有可能没有被写入CMOS
    
    如果要确保修改生效可以执行"hwclock -w" 将其写入硬盘
    

    十.重启, 关机, 注销

    1.重启

    shutdown -r 10			//10分钟后重启
    shutdown -r 0			//立即重启
    shutdown -r now			//立即重启
    init 6				//立即重启
    reboot				//立即重启
    

    2.关机

    shutdown -h 10			//10分钟后关机
    shutdown -h 0			//立即关机
    shutdown -h now			//立即关机
    init 0				//立即关机
    halt				//立即关机
    poweroff			//立即关机.
    
    • 取消正在进行的关机或者重启

    shutdown -c
    

    3.注销

    1.exit
    2.logout
    3.Ctrl + d
    

    十一.查看操作系统版本

    //查看操作系统版本
    # cat /etc/redhat-release
    
    //内核版本
    # uname -r
    # uname -a
    

  • 相关阅读:
    构建Linux根文件系统(未完待续)
    Bootloader的结构和启动过程
    linux文件属性介绍
    内核中设备树的操作函数
    Redis缓存之Set使用
    cookie的三种操作方法
    毕业一年(这个总结来的比较晚)
    MongoDb 聚合报错
    Asp.Net alert 方法
    JQuery拖拽排序
  • 原文地址:https://www.cnblogs.com/songhaixing/p/13833084.html
Copyright © 2020-2023  润新知