zoukankan      html  css  js  c++  java
  • Linux:Shell脚本学习

     概念

    真正能够控制计算机硬件(CPU、内存、显示器等)的只有操作系统内核(Kernel),图形界面和命令行只是架设在用户和内核之间的一座桥梁。

    由于安全、复杂、繁琐等原因,用户不能直接接触内核(也没有必要),需要另外再开发一个程序,让用户直接使用这个程序;该程序的作用就是接收用户的操作(点击图标、输入命令),并进行简单的处理,然后再传递给内核。如此一来,用户和内核之间就多了一层“代理”,这层“代理”既简化了用户的操作,也保护了内核。

    用户界面和命令行就是这个另外开发的程序,就是这层“代理”。在Linux下,这个命令行程序叫做Shell。

    Shell 除了能解释用户输入的命令,将它传递给内核,还可以:

    • 调用其他程序,给其他程序传递数据或参数,并获取程序的处理结果;
    • 在多个程序之间传递数据,把一个程序的输出作为另一个程序的输入;
    • Shell 本身也可以被其他程序调用。

    Shell 是将内核、程序和用户连接了起来。

    Shell 虽然没有 C/C++、Java、Python 等强大,但也支持了基本的编程元素,例如:

    • if...else 选择结构,switch...case 开关语句,for、while、until 循环;
    • 变量、数组、字符串、注释、加减乘除、逻辑运算等概念;
    • 函数,包括用户自定义的函数和内置函数(例如 printf、export、eval 等)

    站在这个角度讲,Shell 也是一种编程语言,它的编译器(解释器)是 Shell 这个程序。我们平时所说的 Shell,有时候是指连接用户和内核的这个程序,有时候又是指 Shell 编程。

    Shell 既是一种脚本编程语言,也是一个连接内核和用户的软件

    常见的Shell有sh bash csh tcsh ash等

    sh: Bourne shell 由 AT&T 公司的 Steve Bourne开发,sh 是 UNIX 上的标准 shell

    bash:bash shell 是 Linux 的默认shell,bash 由 GNU 组织开发,保持了对 sh shell 的兼容性

    使用

    启动终端模拟包或者从 Linux控制台登录后,便可以看到Shell提示符。提示符是通往 Shell 的大门,是输入 Shell 命令的地方。

    Shell 通过PS1和PS2两个环境变量来控制提示符格式:PS1 控制最外层命令行的提示符格式;PS2 控制第二层命令行的提示符格式。

    Shell Script 用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,这个文件后缀为.sh

    打开文本编辑器,新建一个文本文件,并命名为test.sh

    在test.sh中输入代码:

    #!/usr/bin/env bash
    echo "Hello World !" #这是一条注释

    第1行的#!是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种Shell;后面的 /bin/bash就是指明了解释器的具体位置。

    第2行即为代码内容。第2行的#及其后面的内容是注释,Shell脚本中所有以#开头的都是注释(当然以#!开头的除外)

    如何执行test.sh这个程序呢?有三种方法,首先切换到test.sh所在的目录:使用点号 例如  . ./test.sh;使用source命令 ,例如source test.sh;作为解释器参数,例如 /bin/bash test.sh。可以使用 chmod +x test.sh 让这个脚本文件变为可执行的。

    语法

    用赋值符号 = 时,前后都不能加空格。

    字符串的拼接不需要任何连接符,写在一起就可以。

    整数运算需要写在 (( 运算表达式 )) 中,可以用 $(( 运算表达式 )) 取值。

    关键字 [[ 表达式 ]] 这个表达式的成立时,退出状态为0,否则为非0值。

    将命令的执行结果赋值给变量:

    • variable=`command`
    • variable=$(command)

    shell中函数在定义时不能指明参数,但在调用时却可以传递参数。函数参数是shell位置参数的一种,在函数内部可以使用$n来接收,例如,$1表示第一个参数,$2表示第二个参数,依次类推。$#可以获取传递的参数个数;$@和$*可以一次性获取所有的参数。

    当 $* 和 $@ 不被双引号" "包围时,它们之间没有任何区别,都是将接收到的每个参数看做一份数据,彼此之间以空格来分隔。

    但是当它们被双引号" "包含时,就会有区别了:

    • "$*"会将所有的参数从整体上看做一份数据。
    • "$@"仍然将每个参数都看作一份数据,彼此之间是独立的。

    使用for循环逐个输出数据,可以看出区别。

     非原创,侵删,内容来源 http://c.biancheng.net/shell/

    End

  • 相关阅读:
    HTML5 meta最全使用手册
    CSS3实现开门动画
    angularJS学习资源最全汇总
    酷炫放大镜canvas实现
    完成评论功能
    从首页问答标题到问答详情页
    首页列表显示全部问答,完成问答详情页布局
    制作首页的显示列表。
    发布功能完成。
    登录之后更新导航
  • 原文地址:https://www.cnblogs.com/colin220/p/10174278.html
Copyright © 2011-2022 走看看