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

原文地址:https://www.cnblogs.com/colin220/p/10174278.html