Skip to content

Latest commit

 

History

History
147 lines (142 loc) · 9.82 KB

File metadata and controls

147 lines (142 loc) · 9.82 KB

Shell学习笔记(个人向)


1. 简介

  • shell是一个命令行解释器,负责接收用户输入的命令,然后再调用操作系统的内核去执行这些命令,再把执行的结果返回给用户。
  • shell有很多种类,常见的有Bourne shell(sh)Bashcshkshzsh。Windows自己也有powershell和命令提示符。不同的版本之间只存在有很小的差异,大部分命令是通用的。在Linux系统中默认安装的是Bash,Windows使用较多的则是powershell
  • 要在Windows环境使用shell,可以使用自带的powershell或者用WSL安装一个Linux;又或者安装Git后会自带一个轻量化的GitBash,这个已经能满足一般人大多数的需求了。
    而在Mac或者Linux中,只要打开终端就可以直接使用shell,非常简单。

2. Shell的使用

版本控制

  • 可以使用cat /etc/shells查看当前目录下的所有shell版本;而若要查看当前系统默认所使用的shell版本,可以查看环境变量,它存储系统的一些配置信息。对于环境变量,可以使用echo $<环境变量名>的语句访问。例如$HOME存储当前用户的家目录;$PATH用于存储系统的查找路径;$SHRELL用于存储当前系统默认使用的shell的路径。

    可以使用echo $0来查看当前正在执行的脚本的名称。$0反映的是当前正在使用的(shell)版本;而$SHELL则是配置信息,是一个相对固定的值,不会随$0的变化而变化。**我们可以通过输入想要版本的shell的路径来切换正在执行的脚本,也即是$0的值。**退出回环境变量的版本输入exit即可。

脚本

  • 把定时想要执行的命令写入到一个文件中,通过执行这个文件,来一次性执行所有的命令。这个文件就是shell脚本
  • shell脚本可以用来编写一些自动化的任务,如安装软件、备份数据、系统运维巡检等。
  • shell脚本的文件扩展名一般是.sh
  • 如何来编写一个简单的shell脚本文件:
    vi <脚本名>.sh       //用vim创建一个文件并开始编辑
    进入vim后
     #!/bin/<解释器名称>         //在开头设置好使用的shell解释器的种类,如Bash、zsh等  
     <具体的要执行的脚本内容>  
     date        //用于显示当前的日期和时间  
     whoami         //用于显示当前用户名  
     :wq         //保存文件并退出vim
    回到终端后,要先设置脚本文件的权限,且要执行脚本,我们必须要有脚本文件的执行权限。
    chmod <权限信息> <脚本名>.sh
    接着可以执行脚本文件
    ./<脚本名>.sh
  • shell脚本的功能非常强大,它支持分支、条件判断、循环等等,还可以定义函数和变量,可以调用系统命令和其他程序,还可以对文件进行读写等操作。
  • shell脚本中的变量默认是global(全局的)。所以如果想在函数中定义一个局部变量的话,就需要在定义的时候在变量名前面加上local关键字。
  • ==shell脚本中的内容与c++略有不同==:
    1. 首先,它的取值语句是:
      $<变量名>
    2. 其次,它的大小比较不单靠符号还可以靠速记词,如: s1
    3. 脚本的条件判断语句要求非常严格,格式为:
      if [[ <判断条件> ]]; then  
         <执行内容>  
      fi 
      if [[ <判断条件> ]]; then  
         <执行语句1>
      else 
         <执行语句2>  
      fi
      if [ <判断语句1> ]; then
         <> 
      elif [[ <判断语句2> ]]; then 
         <执行语句1>  
      ···
      else 
         <执行语句n>  
      fi
      其中中括号内和判断内容间严格要求左右都要有一个空格,否则会报错;then后缩进接执行语句,最后对齐靠fi结束条件判断。
    4. 脚本的循环语句也比较严格。在shell中存在两种常见的循环,一种是for循环,另一种是while循环。其格式为:
      for((<循环判断条件>)); do  
          <执行语句>  
      done
      while [[ <循环判断条件> ]]  
      do  
      <执行语句>  
      done
      其中,循环判断条件格式和c++用法基本一致,但是要求for后边的内容要用两队小括号框起来,且用;分开后空格+do以表示开始执行,最后靠done对齐结尾说明本轮循环执行结束。
    5. shell脚本中的注释都是用#开头的
    6. shell脚本通过read接收输入,当带上-p操作符时,代表循环重复输入,具体格式如下:
      read -p "<提示信息>" <接受输入的变量名>
      例如:
      s2
    7. 脚本也允许传入参数,参数以$<参数1名字>$<参数2名字>……的形式==空格隔开排列在脚本名后边,并在脚本文件中使用==,为了简单也有使用$1$2……的($0有特殊含义,被注释掉了不能用),例如:
      s4
      同时,shell还有其他特殊的变量,具体如下:
      s5
    8. 对于shell来说,若我们想要将一些值固定下来成为常量,可以使用赋值的方式使其成为环境变量
      如:
      s6
      在shell中定义了两个常量。若我们想要它们在nano\vim中也可以被使用,则可以进一步用export <变量名>=<值>暂时将它们定义成环境变量(只要退出当前shell会话上述并以就会失效。)
      1. 如果我们想要我们定义的变量永远成为环境变量,则我们可以利用用户的家目录HOME下的隐藏文件.bashrc or .zshrc等shell终端配置文件(每创建一次shell会话就会产生一个)或.profile用户登录执行配置文件(用户每次登陆都只执行一次)。其中,.profile会调用.bashrc,故一般推荐将添加的永久环境变量添加到.bashrc文件中。
      2. 或者可以存到系统根目录下的.etc文件夹下的.bashrc.profile文件内。这些文件存储的环境变量是对所有用户都有效的
      3. 保存方法是用nano打开.bashrc或者.profile文件,然后再最末尾用export <变量名>=<值>命令添加环境变量然后保存退出。**最后记得要读取新修改的这些环境变量,需要使用source <加载的文件名>或者.<加载的文件名>**来重载刷新修改后的文件;又或者直接退出当前shell会话,重新登陆让系统重新读取配置文件。
    9. .bashrc文件除了可以定义永久环境变量外,还可以定义命令的一些别名以方便和简化使用。定义别名的格式如下:
      alias <定义的别名>='<原先的内容>'

可视化编辑

  • vim是很普遍的终端文本编辑器,但它的图形化界面做的很烂,对此为了提高效率和我们对脚本的理解,这里引入nano可视化编辑器。
  • 创建文件方式与vim一样,使用nano <文件名>的方式打开并进入nano。
  • 在nano中,保存可以使用ctrl+X保存并回车退回bash界面,例如:
    s3
  • 要执行脚本文件,m命令语句可以使用
    bash <脚本文件名>.sh
    也可以使用
    ./<脚本文件名>.sh
    区别在于后边这种执行方式需要事前给脚本文件添加上一个执行权限

随机数生成

  • 在Linux中有很多生成随机数的方法,如专门的随机数函数shuf,格式为:
    shuf -i <下界>-<上界> -n <生成随机数的个数>
  • 或者使用$RANDOM这个系统变量,它。每次会在0-32767之间生成一个随机数;若我们要他落在较小的范围,可以使用取模运算。例如要它落在1-10之间,可以用$((RABNDOM % 10 + 1))来表示。

    注意,echo关键词后要展示的内容一定要是常量,在nano中用$()取值;在shell中用$(())取值。

语句传值

  • 在shell中,如果我们要给变量传递一个语句运算后的结果,有两种方式,即:
    1. 在语句外用反引号`括起来,如:  
        number=`shuf -i 1-10 -n 1`  
    2. 或者直接用取值的符号$,如:  
        number=$(shuf -i 1-10 -n 1)

    注意,shell中对于空格的使用是极其严格的,有没有空格区别很大。所以该有的地方一定要有,没有的地方不要随便乱加,不然会报错。

循环控制

  • 常用的关键词是breakcontinue
  • 和c++等语言一样,break是跳出所有循环,而continue是跳出当前这层循环,忽略语句之后的内容进入下一轮循环
  • 当我们使用read接收内容的时候,若在当前情况下尚未赋值,则接收read值的变量自己会有一个默认值
  • 由用户选择跳出操作的脚本,通常是==最外层死循环==配合continuebreak语句进行条件控制
  • ==shell脚本也支持使用逻辑运算符来连接多个条件进行逻辑运算。==

其他

  • Shell还可以配合grepawksed等命令进行文本处理;或者使用函数、数组这些数学逻辑工具进行计算;又或者使用各种系统命令进行系统管理和监控。
    具体可见于Shell 基础教程