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=
    b= 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
  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)
    #. 使用数组名,不加下标的形式访问数组例如:
    echo $a; #这种情况默认输出的是下标为0的元素, 如果没有定义下标为0的元素, 将会输出空值
    #. 输出元素的时候,不加花括号:
    echo $a[] #将会输出 a0[] , 如果想要输出指定下标的元素, 必须加上花括号 echo ${a[]}

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

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

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

开始学习shell的更多相关文章

  1. 学习 shell脚本之前的基础知识

    转载自:http://www.92csz.com/study/linux/12.htm  学习 shell脚本之前的基础知识 日常的linux系统管理工作中必不可少的就是shell脚本,如果不会写sh ...

  2. Shell高级编程视频教程-跟着老男孩一步步学习Shell高级编程实战视频教程

    Shell高级编程视频教程-跟着老男孩一步步学习Shell高级编程实战视频教程 教程简介: 本教程共71节,主要介绍了shell的相关知识教程,如shell编程需要的基础知识储备.shell脚本概念介 ...

  3. 学习Shell脚本编程(第2期)_编写修改权限及执行Shell程序的步骤

    编写Shell程序 执行Shell程序 Shell程序有很多类似C语言和其他程序设计语言的特征,但是又没有程序语言那样复杂.Shell程序是指放在一个文件中的一系列Linux命令和实用程序.在执行的时 ...

  4. 第十三章、学习 Shell Scripts

    什么是 Shell scripts shell script (程序化脚本) :shell script 是针对 shell 所写的『脚本!』 shell script 是利用 shell 的功能所写 ...

  5. 菜鸟教程之学习Shell script笔记(上)

    菜鸟教程之学习Shell script笔记 以下内容是,学习菜鸟shell教程整理的笔记 菜鸟教程之shell教程:http://www.runoob.com/linux/linux-shell.ht ...

  6. 鸟哥的Linux私房菜——第十六章:学习Shell Scripts

    视频链接:http://www.bilibili.com/video/av10565321/ 1. 什么是 Shell Script       (shell写的脚本)1.1 干嘛学习 shell s ...

  7. 学习shell脚本之前的基础知识

    日常的linux系统管理工作中必不可少的就是shell脚本,如果不会写shell脚本,那么你就不算一个合格的管理员.目前很多单位在招聘linux系统管理员时,shell脚本的编写是必考的项目.有的单位 ...

  8. (转)跟着老男孩一步步学习Shell高级编程实战

    原文:http://oldboy.blog.51cto.com/2561410/1264627/  跟着老男孩一步步学习Shell高级编程实战 原创作品,允许转载,转载时请务必以超链接形式标明文章 原 ...

  9. 鸟哥的Linux私房菜-第10/11/12/13章(vim程序编辑器、学习bash、正则表达式与文件格式化处理、学习Shell Scripts)

    第10章 vim程序编辑器 可以将vim看做vi的进阶版本,vim可以用颜色或底线等方式来显示出一些特殊的信息. 为何要学习vim?因为: a. 所有的 Unix Like 系统都会内建 vi 文书编 ...

  10. 跟着老男孩一步步学习Shell高级编程实战

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://oldboy.blog.51cto.com/2561410/1264627 本sh ...

随机推荐

  1. 南昌网络赛C.Angry FFF Party

    南昌网络赛C.Angry FFF Party Describe In ACM labs, there are only few members who have girlfriends. And th ...

  2. Java 注解(原理及其使用)

    一.注解(annotation)介绍 Java在JDK5中引入源代码的注解机制. 1.什么是注解? 注解为代码添加了元数据,元数据是关于数据的组织.数据域及其关系的说明信息. 更通俗的说,注解为程序元 ...

  3. MySQL的简介、启动及其DDL

    MySQL的各项配置: 默认会启用TCP/IP网络: 默认客户端/服务器端口:3306: 将数据库的BIN目录写入Windows的的path环境变量: 默认不允许root用户在其他机器上远程登录: M ...

  4. C#文本转换为Json格式

    private string ConvertJsonString(string str)        {            //格式化json字符串            JsonSeriali ...

  5. CentOS/RHEL 安装EPEL第三方软件源

    EPEL源简介 EPEL(Extra Packages for Enterprise Linux) 是由 FedORA 社区打造,为 RHEL 及衍生发行版如 CentOS等提供高质量软件包的项目.装 ...

  6. Java学习 面向对象(下)——Java疯狂讲义th4

    面向对象(下) [TOC] 包装类 通过包装类可以把8个基本类型的值包装成对象使用. 自动拆箱.自动装箱 把字符串类型值转换成基本类型的值: 包装类的 parseXxx(String s)静态方法 包 ...

  7. Centos6.8 rabbitmq搭建且修改默认端口

    一.安装依赖环境 yum install build-essential openssl openssl-devel unixODBC unixODBC-devel make gcc gcc-c++ ...

  8. java三大框架——Struts + Hibernate + Spring

    Struts主要负责表示层的显示 Spring利用它的IOC和AOP来处理控制业务(负责对数据库的操作) Hibernate主要是数据持久化到数据库 再用jsp的servlet做网页开发的时候有个 w ...

  9. DevOps与Kubernetes 、容器的关系

    近两年,随着容器.Kubernetes 等技术的兴起,DevOps 这个概念被广泛提及并被大量使用. 本文将会从以下几个方面着手,结合实验展现的方式,让读者真正理解 DevOps 的含义. DevOp ...

  10. textarea框自适应高度

    export function autoTextarea(elem, extra, maxHeight){ /**textarea文本域随内容的多少而调整高度 */ extra = extra || ...