一、 Shell变量

  1. 变量可分为两类: 环境变量(全局变量) 和 局部变量 。

    环境变量 : 所有的环境变量都是系统全局变量,可用于所有子进程中,这包括编辑器、shell脚本和各类应用 。

         环境变量可以在命令行中设置,但用户退出时这些变量值也会丢失,因此最好在用户家目录下的.bash_profile文件中或全局配置

          /etc/bashrc、/etc/profile文件或者/etc/profile.d/ 中定义 。 将环境变量放入profile文件中 , 每次用户登录时这些变量值都将被初始化

         所有环境变量均为大写。

         环境变量应用于用户进程前,必须用export命令或source或"."命令导出。

         通过百度 查看一些linux常用的系统环境变量。

         常用的环境变量 :

           (1) 修改 history命令显示的历史命令记录数:  HISTFILESIZE=5

                                HISTSIZE=5

           (2) 查看系统文件的类型:  $HOSTTYPE

           (3) 查看系统主机名:  $HOSTNAME

    局部变量 :

         定义变量 : (1) 变量名=value

                (2) 变量名='value' , 使用单引号中的内容是什么就是什么,里面如果有变量是不会进行解析的。

                (3) 变量名="value" , 使用双引号引的内容中,如果有变量会将变量解析成内容进行显示

         考题 : a = 192.168.1.2

              b = '192.168.1.2'

              c = "192.168.1.2"

              a = 192.168.1.2 - $a

              b = '192.168.1.2 - $a'

              c = "192.168.1.2 - $a"

              echo "a = $a"

             echo "b = $b"

              echo "c = ${c}"

              注:  $a 与 ${c} 是一样的效果

           答案 : a = 192.168.1.2 - 192.168.1.2

             b = 192.168.1.2 - $a

             c = 192.168.1.2 - 192.168.1.2 - 192.168.1.2

         将变量作为内容的两种方式:

            (1) cmd = `date + %F`

            (2) cmd = $(date + %F)

           什么时候使用${var}这种带大括号的场景 ?

            如: tar -xzvf fcz_$pwd_log.tar.gz  ,系统不知道是pwd做为变量 还是 pwd_log做为变量

              此时如果使用大括号 tar -xzvf fcz_${pwd}_log.tar.gz 明确告诉系统pwd是变量,而pwd_log不是变量 。

    shell 特殊变量 :

      (1) 位置变量

        $0 获取当前执行的shell脚本的文件名

        fcz.sh中的内容 : echo $0

        sh  fcz.sh  =>  fcz.sh

        sh  /root/fcz.sh  =>  /root/fcz.sh     // 这种运行方式,会将路径一起打印出来

        fcz.sh中的内容 : dirname $0  =>  /root

        fcz.sh中的内容 : basename $0  =>  fcz.sh

         $n  获取第n个参数,当n>=10时,要在数字上添加{}  ,即${10}

        $*  获取当前shell的所有参数,将所有的命令行参数视为单个字符串

        $#  获取当前shell命令行中参数的总个数

        $@  获取这个程序的所有参数 "$1" "$2" "$3" "$4" "..." , 这是将参数传递给其他程序的最佳方式,因为它会保留所有内嵌在每个参数里的任何空白。

      (2) 进程状态变量

        $$  获取当前shell的进程号 ( PID )

        $!  执行上一个指令的PID

        $?  获取执行上一个指令的返回值 ( 0为成功,非零为失败)

          $?的使用场景 : 1. 编程时判断语句是否执行成功

                  2. 控制台执行语句时,判断上一条语句是否执行成功 .   echo  $?

          $?返回值参考:

            0 : 表示运行成功

            2 : 权限拒绝

            1 ~ 125 : 表示运行失败,脚本命令、系统命令错误或参数传递错误

            126 : 找到该命令了,但是无法执行

            127 : 未找到要运行的命令

            >128 : 命令被系统强制结束

            提示 : 在脚本调用,一般用 exit 0 , 函数 return 0

    bash 内部变量:

      由shell本身提供,常用的内部命令有: echo , eval , exec , export , readonly , read , shift , wait , exit 和 (.) 等

      

  二、 变量的子串操作

    1. ${#string} : 返回$string的长度

    2. ${string:position} : 在$string中,从位置$position之后开始提取子串

    3. ${string:position:length} : 在$string中,从位置$position之后开始提取长度为$length的子串

    4. ${string#substring} : 从变量$string开头开始删除最短匹配$substring子串

    5. ${string##substring} : 从变量$string开头开始删除最长匹配$substring子串

    6. ${string%substring} : 从变量$string结尾开始删除最短匹配$substring子串

    7. ${string%%substring} : 从变量$string结尾开始删除最长匹配$substring子串

    8. ${string/substring/replace} : 使用$replace 来代替第一个匹配的$substring

    9. ${string/#substring/replace} : 如果$string前缀匹配$substring , 就用$replace来代替匹配$substring

    10. ${string/%substring/replace} : 如果$string后缀匹配$substring , 就用$replace来代替匹配$substring

    11. ${string:-str2} : 如果变量string有定义,就返回string的值,如果string没有定义,就返回str2的值。

       eg :   result = ${fcz:-FENGCONGZHI}

          echo $result

          输出:FENGCONGZHI

          echo $fcz

          输出:空

    12. ${string:=str2} : 如果变量string有定义,就返回string的值,如果string没有定义,就把str2的值赋值给string,并把str2的值返回。

       eg :   result = ${fcz:-FENGCONGZHI}

          echo $result

          输出:FENGCONGZHI

          echo $fcz

          输出:FENGCONGZHI    // 这个地方与上一个输出不同

    13. ${string:?"not defined"} : 如果变量string未定义,就抛出异常 -bash: string: command not defined

    14. ${string:+str2} : 如果变量string定义了就返回str2的值

    15. ${string-str2} : 类似于 ${string:-str2}

二、变量的数值计算

  1. 变量的数值计算常见的有如下几个命令:

    (()) 、 let 、 expr 、 bc 、 $[]

    (1)   (())用法 : 很常用,且效率高

        场景 : 执行简单的整数运算.

        eg : ((a = 1+2**3 -4%3))

           echo $a

         输出 : 8

         echo  $((a+=1))

         输出 : 9

    (2)  let赋值表达式 : ( 效率没有"(())" 高 )

        eg : let a = a+10

           echo $a

         输出 : 19

    (3) expr 用法: 略

        eg : 通过expr判断变量是否为整数

         expr  a + 0   =>   expr : 语法错误

expr  $?   =>   2     // 不等于0表示上面的语句执行失败

           expr   1 + 0   =>    1

              expr  $?   =>   0    // 0表示上面的语句执行成功

    (4) bc 用法: 支持小数的功能

        i=2

        echo $i+1  =>  2+1

        echo $i+1|bc   =>   3

    (5) typeset 用法 :

        typeset  -i  A=1  B=3

        A=A+B

        echo  $A  =>  4

    (6) $[] 用法 :

        echo $[ 2+3 ]   =>  5

三、shell 变量的输入

  Shell 变量除了可以 直接赋值 或 脚本传参 外,还可以使用read命令从标准输入获得.

  语法格式:

    read  [参数]  [变量名]

  常用参数:

    -p   prompt  : 设置提示信息

    -t    timeout  : 设置输入等待的时间,单位默认为秒。

  eg  :     read  -p  "pls  input  a number:" name1  name2

      pls  input  a  number:fcz zxy

      echo $name1  $name2    =>  fcz  zxy

四、语法

  1. 条件测试语法

    格式1: test  <测试表达式>

    格式2: [ <测试表达式> ]

    格式3: [[ <测试表达式> ]]

    说明: 格式1和格式2 是等价的 , 格式3为扩展的test命令.

        在[[ ]] 中可以使用通配符进行模式匹配。 && 、 || 、 > 、 < 等操作可以应用于[[ ]]中,但不能应用于[]中。

    eg :

      (1) 测试文件是否存在

        test  -f  file  &&  echo  true ||  echo  false

        [ -f  file ]  &&  echo  true  ||  echo  false

        [ -d file ]  &&  echo  true ||  echo  false  // 测试file是不是目录

        [ -x file ]  &&  echo  true  || echo  false   // 测试file是不是可执行的文件

      (2) test命令非 (!) 的写法

        test  !  -f  file  &&  echo  true  ||  echo  false

    常用文件测试操作符号:

    -f   :  若文件存在且为普通文件则真

    -d  :  若文件存在且为目录文件则真

    -s  :  若文件存在且不为空(文件大小非0)则真

    -e  :  若文件存在则真,要区别 -f

    -r  :  若文件存在且可读则真

     -w  : 若文件存在且可写则真

    -x  :  若文件存在且可执行则真

    -L  :  若文件存在且为链接文件则真

    f1 -nt  f2  :  若文件f1比文件f2新则真

    f1 -ot  f2  :  若文件f1比文件f2旧则真

  2. 字符串测试语法 :

    常用字符串测试操作符

    -z  "字符串"  :  若串长度为0则真 ,

    -n  "字符串"  :  若串长度不为0则真,

    "串1" = "串2"  :  若串1等于串2则真,

    "串1" != "串2"  :  若串1不等于串2则真.

    注: 以上比较时字符串一定要用引号引起来.

  3. 数值比较语法 :

    在[ ]中比较符 :            -eq 、 -ne  、  -gt  、 -ge  、  -lt  、 -le  、 -a    、  -o

    在(( )) 和 [[ ]]中比较符 == 、!=    、  >    、 >=  、 <    、 <=  、 &&  、  ||

  4. if 语法

    单分支:

      if 条件

        then

          指令

      fi

    双分支:

      if 条件

        then

          指令

      else

          指令

      fi

    多分支:

      if 条件

        then

          指令

      elif 条件

        then

          指令

      else

          指令

      fi  

  5. case 结构条件句语法:

    case  "字符串变量"  in

      值 1)  指令 1... ;;

      值 2)  指令 2... ;;

      *)  指令...

    esac

    eg : 根据用户的输入判断是哪个数字

      read  -p  "please  input  a number:"  ans

      case  "$ans"  in

      1)

        echo   "the  num  you  input  is  1"

      ;;

      2)

        echo  "the  num  you   input  is  2"

      ;;

      [3-9])

        echo  "the  num  you   input  is  $ans"

      ;;

      *)

        echo  "the  num  you input  must  be  less  9"

      esac

shell 入门基础的更多相关文章

  1. Linux shell入门基础(六)

    六.Shell脚本编程详解 将上述五部分的内容,串联起来,增加对Shell的了解 01.shell脚本 shell: # #perl #python #php #jsp 不同的脚本执行不同的文本,执行 ...

  2. Linux shell入门基础(一)

    Linux shell入门基础(一): 01.增加删除用户: #useradd byf   userdel byf(主目录未删除)  userdel -r byf   该用户的属性:usermod 用 ...

  3. Linux shell入门基础(八)

    八.shell脚本sed&awk 01.sed的使用 流编辑器-Steam Editor #ed /etc/passwd 1,10p …… 1s/root/byf/p(替换root为byf) ...

  4. Linux shell入门基础(二)

    二.shell对文本的操作 01.查看文本的命令 #cat /etc/passwd(并非对文本文件操作) #tail -5 /etc/passwd(查看末尾5行) #tail -f /var/log/ ...

  5. shell入门基础&常见命令及用法

    shell shell是一个命令解释器,实际是一个程序,/bin/bash,linux中所有的命令都由它来解释,有自己的语法 shell脚本 以.sh结尾 shell语法+linux命令 注释: 单行 ...

  6. shell入门基础必备

    作者:KornLee 2005-02-03 15:32:57 来自:Linux先生    1.建立和运行shell程序   什么是shell程序呢? 简单的说shell程序就是一个包含若干行 shel ...

  7. Shell入门基础

    Shell的Helloworld #!/bin/bash echo "helloworld taosir" 执行方式 方式一:用 bash 或 sh 的相对或绝对路径(不用赋予脚本 ...

  8. Linux shell入门基础(七)

    七.bash脚本中的流程控制   条件判断控制   -[]([]中的表达式是否为真)  &&(前边的结果是true的时候执行后边的命令)   ||(前边的结果是false的时候执行后边 ...

  9. Linux shell入门基础(五)

    五.bash运算及启动脚本 01.使用bash的命令历史 #history …… #set(显示所有的变量) | grep HIS HISTFILE=/root/.bash_history HISTF ...

随机推荐

  1. python使用wget下载网络文件

    wget是一个从网络上自动下载文件的自由工具.它支持HTTP,HTTPS和FTP协议,可以使用HTTP代理. ubuntu 安装wget pip install wget 从网络或本地硬盘下载文件(并 ...

  2. js工具类的封装

    common.js原生js实现的大多工具方法都将放在common文件中 布局rem.js,vue开发时,我们只需要将rem.js再main.js中import 引入即可 (function(win, ...

  3. Android学习笔记之Android Studio下创建menu布局文件

    1.创建menu文件夹 Android Studio项目中如果没有menu文件夹,在res文件夹右键,new-Android resource directory: 则会弹出下图对话框,在Resour ...

  4. 关于掌握C#的内存堆栈概念

    很多时候,我们使用C#语言书写业务逻辑时,并不会太多地主动考虑到内存的占用和分配问题,但编的程序多了,就总会遇到一些性能问题.提到"性能"二字,就不得不考虑CPU和内存,而提到内存 ...

  5. Codeforces 17E Palisection 【Manacher】

    Codeforces 17E Palisection E. Palisection In an English class Nick had nothing to do at all, and rem ...

  6. ASP.NET Core 中的Ajax全局Antiforgery Token配置

    前言 本文基于官方文档 <在 ASP.NET Core 防止跨站点请求伪造 (XSRF/CSRF) 攻击>扩展另一种全局配置Antiforgery方法,适用于使用ASP.NET Core ...

  7. 1G1核1M选择 Centos 32位 还是 Centos 64位?

    前几天有个疑惑,现有一台云主机是 1G1核1M使用 Centos 64位会不有点浪费. 还专门发信息询问老大 Karson,老大说现 FastAdmin 都是三个1,也是 64 位的. 看 FastA ...

  8. linux多线程并发

    多线程并发 进程和线程的概念 进程 进程包括程序映象.地址空间等要素.内核采用PCB来管理进程.进程是内核进行调度的基本单元,每个独立的进程都有自己的代码段.数据段以及堆栈,它们有自己的虚拟地址空间, ...

  9. vs2017 xamarin导入jar,SO文件的问题

    最近要弄用vs弄个安卓的系统,因为要使用硬件,所以要引进jar,SO文件 导入jar文件很顺利,具体步骤我也是在网上找的这里给个链接 http://www.2cto.com/kf/201604/502 ...

  10. DP 过河卒

    棋盘上A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下.或者向右.同时在棋盘上C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点.因此称之为“马拦过河卒”. 棋盘用坐标 ...