• 开始学习shell


    1. 运行shell脚本有两种方法:
      1. 作为可执行程序,假如在某个目录下,编写了一个shell脚本test.sh,想要执行这个脚本,就需要先cd进入脚本所在目录,
        chmod  +x  ./test.sh  # 是脚本具有执行权限
        ./test.sh  #执行脚本

        注意一定要写成 ./test.sh,而不是 test.sh。运行其它二进制的程序也一样,直接写 test.sh,linux 系统会去 PATH 里寻找有没有叫 test.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 里,你的当前目录通常不在 PATH 里,所以写成 test.sh 是会找不到命令的,要用 ./test.sh 告诉系统说,就在当前目录找。

      2. 作为解释器参数:  直接运行解释器,其参数就是shell脚本文件名,比如
        /bin/sh test.sh
        /bin/php test.php

    2. shell变量:
      注意: 变量名和等号之间不能有空格。定义变量时,变量名不加美元符号。name="Bob"。使用一个定义过的变量,只要在变量名前面加美元符号即可,echo  $name。或echo ${name}。变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,重新赋值变量的时候也不加$。
      使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。(可简单理解为常量,但有不一样的地方)
      myUrl="http://www.google.com"
      readonly myUrl

      删除变量unset name  ,unset 和 readonly 操作变量的时候,也是不加$, 但要注意, unset 不能删除删除  只读变量

    3. 变量类型:局部变量、环境变量、shell变量。
      局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
      所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
       shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行。
    4. 单引号和双引号:
      your_name="runoob"
      # 使用双引号拼接
      greeting="hello, "$your_name" !"
      greeting_1="hello, ${your_name} !"
      echo $greeting  $greeting_1
      # 使用单引号拼接
      greeting_2='hello, '$your_name' !'
      greeting_3='hello, ${your_name} !'
      echo $greeting_2  $greeting_3
      
      输出:
      hello, runoob ! hello, runoob !
      hello, runoob ! hello, ${your_name} !
      //当双引号或单引号成对使用的时候, 就是连接字符串,在PHP中需要使用 . 来连接, 而shell不需要加 . 其他的和PHP类似,双引号可以解析变量, 单引号做不到。
    5. 传递参数:  在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n。n是数字.   $0 代表的是文件名, $1....$n代表的是第一个参数到第n个参数. 
    6. 几个特殊字符用来处理参数
      1. $#   表示传递了几个参数;
      2. $*    表示以一个单字符串显示所有向脚本传递的参数。
      3. $$    表示脚本运行的当前进程ID号
      4. $@   和$*都是以单字符串显示所有向脚本传递的参数, 在不加引号的情况下
      5. $?     显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误
      6. $!     后台运行的最后一个进程的ID号
    7. 变量定义的时候,加引号和不加引号的区别:
      1. 使用单引号的情况下,不管里面的是否有变量或者其他的表达是都是原样子输出;
      2. 使用双引号,如果内容中有命令(要反引下)、变量、特殊转义符等,会先把变量、命令、转义字符解析出结果,然后再输出最终内容;
      3. 不使用引号,赋值时,如果变量内容中有空格,则会造成赋值不完整。而在输出内容时,会将含有空格的字符串视为一个整体来输出;如果内容中有命令(要反引下)、变量等,则会先把变量、命令解析出结果,然后输出最终内容;如果字符串中带有空格等特殊字符,则有可能无法完整地输出,因此需要双引号替代无引号的情况,特别是对变量赋值时改加双引号。一般连续的字符串、数字、路径等可以不加任何引号进行赋值和输出。
      4. 使用反引号:一般用于引用命令,执行的时候命令会被执行
        #!/bin/sh
        c=c1 c2 c3;  #赋值时中间有空格
        echo $c;   #报错,   c2: command not found
        # 加上引号就会把上面的赋值内容当成一个整体
        c='c1 c2 c3';
        echo $c;    # 正常输出 c1 c2 c3 
        #在输出的时候有空格, 会正常输出, 例如
        echo  b1 b2 b3;  #输出 b1 b2 b3
        echo  b1b2b3;    #输出 b1b2b3
    8. 原生bash不支持简单的数学运算, 需要使用expr,  var=`expr 2 + 2`   注意表达式和运算符之间要有空格,且使用反引号。判断相等与不等:[ $a == $b ] 返回 false。[ $a != $b ] 返回 true。同样注意空格不要忘记。乘法需要注意一下
      val=`expr $a * $b`
      echo "a * b : $val"
      # 必须使用  才能实现乘法
    9. 关系运算符
      #!/bin/sh
      a=10
      b=20
      
      if [ $a -eq $b ]
      then
         echo "$a -eq $b : a 等于 b"
      else
         echo "$a -eq $b: a 不等于 b"
      fi
      if [ $a -ne $b ]
      then
         echo "$a -ne $b: a 不等于 b"
      else
         echo "$a -ne $b : a 等于 b"
      fi
      if [ $a -gt $b ]
      then
         echo "$a -gt $b: a 大于 b"
      else
         echo "$a -gt $b: a 不大于 b"
      fi
      if [ $a -lt $b ]
      then
         echo "$a -lt $b: a 小于 b"
      else
         echo "$a -lt $b: a 不小于 b"
      fi
      if [ $a -ge $b ]
      then
         echo "$a -ge $b: a 大于或等于 b"
      else
         echo "$a -ge $b: a 小于 b"
      fi
      if [ $a -le $b ]
      then
         echo "$a -le $b: a 小于或等于 b"
      else
         echo "$a -le $b: a 大于 b"
      fi
      View Code
    10. 数组: shell只支持一维数组, 没有多维数组. Shell 数组用括号来表示,元素用"空格"符号分割开
      a=(a0, a1 a2 a3 , a4)
      echo ${a[@]} #输出全部元素 或者使用${a[*]} 也可以
      #输出的是 a0, a1 a2 a3 , a4
      #以空格作为分隔符, 逗号也是一个元素
      #也可以使用下标定义数组
      b[0]=b0;
      b[1]=b1
      echo ${b[@]} #输出 b0 b1

      读取数组使用${a[@]} 或者是使用${a[*]} 读取数组全部元素, 读取数组某个元素${a[n]} ,  n是数组下标, 读取数组时当数组没有这个值的时候, 并不会报错, 而是输出空值

      #有这样几种情况: 假设定义了这样一个数组
      a=(a0 a1 a2)
      #1. 使用数组名,不加下标的形式访问数组例如:
       echo $a; #这种情况默认输出的是下标为0的元素, 如果没有定义下标为0的元素, 将会输出空值
      #2. 输出元素的时候,不加花括号:
      echo $a[1]    #将会输出 a0[1] , 如果想要输出指定下标的元素, 必须加上花括号 echo ${a[1]}

      获取数组长度: ${#a[@]}  或者 ${#a[*]} 获取数组里元素的个数, 如果是指定下标, 则获取下标对应的元素值的长度,  例如

      a[0]=user0
      echo ${#a[0]}   #将会输出 4 
      echo ${#a[@]}  #输出 1  数组中只有一个元素, 
      echo ${#a[1]} #输出 0 因为没有下标为1 的元素值

       备注:  在Ubuntu系统中使用shell,  第一次编辑.sh文件时, 出现不能编辑, 删除等情况,  使用末行模式, 在末行模式下, 输入set nocompatible 回车, 然后再进入编辑模式. 把set nocompatible这个设置放到~/.vimrc里让它永久生效. 或者安装一个vim编辑器.

  • 相关阅读:
    052 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 14 Eclipse下程序调试——debug2 多断点调试程序
    051 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 13 Eclipse下程序调试——debug入门1
    050 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 12 continue语句
    049 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 11 break语句
    048 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 10 案例——阶乘的累加和
    047 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 09 嵌套while循环应用
    046 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 08 for循环的注意事项
    045 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 07 for循环应用及局部变量作用范围
    剑指OFFER----面试题04.二维数组中的查找
    剑指OFFER----面试题03. 数组中重复的数字
  • 原文地址:https://www.cnblogs.com/bneglect/p/11355167.html
Copyright © 2020-2023  润新知