开始学习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编辑器.

 

转载于:https://www.cnblogs.com/bneglect/p/11355167.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值