【Linux】Shell 编程一(初始 Shell)

来源:互联网 发布:什么软件租房子最靠谱 编辑:程序博客网 时间:2024/05/26 12:02

一、Shell 历史

         shell 的作用是解释执行用户的命令,用户输入一条命令,shell 解释器就执行一条,这种方式成为交互式,shell还有一种执行命令的方式成为批处理(Batch),用户事先写一个shell脚本(Shell Script),其中有很多条命令,让  shell 一次把这些指令执行完,而不必一条条的敲命令,shell脚本和编程语言很相似,也有变量和流程控制语句,但shell脚本是解释执行的,不需要编译,shell程序从脚本中一行一行读取并执行这些指令,相当于一个用户把脚本中的命令一行一行的敲到shell提示符下执行。


          由于历史原因,UNIX 系统上有很多中shell:

          1、sh(Bourne Shell):由 Steve Bourne 开发,各种 UNIX 系统都配置的有 sh。

          2、csh(C Shell):由 Bill Joy  开发,随 BSD UNIX 发布,它的流程控制语句很像 C 语言,支持很多 Bourne Shell 不支持的功能:作业控制,命令历史,命令行编辑;

          3、ksh(Korn Shell): 由 David Korn 开发,向后兼容 sh ,并且添加了 csh   引入的新功能是目前很多 UNIX 系统标准配置的 Shell,在这些系统上 /bin/sh  往往是指向 /bin/ksh 的符号链接。


          4、bash(Bourne Again Shell):由GUN开发的 Shell ,主要目标是与 POSIX 标准保持一致,同时兼顾对 sh 的兼容,bash 从 csh 和 ksh 借鉴了很多功能,是各种 Linux发行版标准配置的 Shell ,在 Linux 系统上 /bin/sh 往往是指向 /bin/bash 的符号链接,虽然如此,bash 和 sh 还是有很多不同的,一方面,bash 扩展了一些命令和参数,另一方面,bash 并不完全和 sh 兼容,有些行为并不一致,所以 bash 需要模拟 sh 的行为:当我们遇过 sh 这个程序名启动 bash 时,bash 可以假装自己是 sh ,不认扩展的命令,并且行为与 sh 保持一致。


二、初步认识 Shell

          1、cat /etc/shells                       查看当前操作系统下所支持的所有  shell 

          2、sh                                         进入 shell 命令解析器

          3、shell 的第一句必须是

                        #!/bin/sh                       这里的 sh 可以替换成 bash、dash 等等;  这句话的意思是指定用 sh 解析器

          4、#                                            # 在shell 中代表注释

          5、执行 shell 脚本的四种方法

                   (1)、chmod  a+x  aa.sh         然后以    ./aa.sh        执行脚本

                   (2)、/bin/bash  aa.sh             使用 /bin 指定解析器执行脚本

                   (3)、. aa.sh                           使用 点和空格 执行脚本

                   (4)、source    aa.sh              使用 source 执行脚本


三、内建命令和小括号

    

           1、 man bash-builtins                     查看系统的内建命令


           2、常用内建命令(不需要解释器执行):

                  (1)、 .                    点

                  (2)、source

                  (3)、alias              查看或修改别名

                  (4)、bg

                  (5)、cd

                  (6)、echo

            3、;(分号)         可以一行执行多个命令


                     例如:

                                cd ...;ls -l                 表示进入上一级目录,并且显示上一级目录的详细信息(此时当前路径已经改变,改为上一级目录)

                                (cd ..;ls -l)               用括号括起来,作用和上面相同,区别是此时不改变当前路径


             4、shell 变量

                  (1)、定义:

                              shell 变量通常由字母、数字、下划线开头,由任意长度的字母、数字、下划线组成。

                  (2)、分类:

                          (a)、环境变量(类比于全局变量

                                  环境变量可以从父进程传递给子进程,因此 shell 进程的环境变量可以从当前 shell 传给 fork 出来的子进程。用 printenv 变量可以显示当前 shell 进程的环境变量。

                          (b)、本地变量(类比于局部变量

                                  不存在与当前 shell 进程,因此当前 shell 进程中所定义的所有变量(包括本地变量和环境变量)和函数。

                  (3)、用法:

                          VAR=hello                         此时把VAR定义成本地变量

                                                                   echo $VAR     将会输出 hello

                          export VAR                        把VAR变量导入到环境变量中

                          用 unset 命令可以删除已经定义的环境变量或本地变量       如, unset VAR

                      注意:

                                 (a)、 一个变量叫做 VAR,用 'VAR'  可以表示它的值,在不引起歧义的情况下用 VAR 表示它的值,通过以下例子比较这两种表示法的不同:

                                          echo $SHELL.

                                 (b)、在定义变量时不用 ' 取变量时要用。shell 变量不需要明确定义类型,事实上shell 变量的取值都是字符串。并且shell 变量不需要先定义后使用,如果对

一个没有定义的变量和取值,则字符串的值为空。


          5、通配符

                   用于匹配的字符称为通配符。如: *,?,[]。

                   *                             匹配 0 个或者多个任意字符

                  ?                            匹配一个任意字符

                   [若干个字符]          匹配方括号中任意一个字符的一次出现。


           6、算术运算及转义字符

                 (1)、命令代换

                          由 “”`” 反引号括起来的也是一条命令,shell 先执行该命令,然后将输出的结果立刻代换到当前命令行中,例如:定义一个变量存放 date 命令的输出:

                                                        DATE=`date`

                                                         echo $DATE

                          可以代换为:

                                                        DATE=$(date)

                 (2)、使用 $(()),用于算数计算, (())那个中的 shell 变量取值将转换成整数,同样含义的 $[] 等价。例如:

                                   VAR=45

                                   echo $((VAR)+3)  <============>  echo $[VAR+3] <==============> $[$VAR+3]

                         $(()) 中只能用 +、-、*、/ 和 () 运算符,并且只能做整数运算。

                         $[base#n]      其中base 表示进制, n按照 base 进制解释,后面再有运算数,按十进制解释。

                 (3)、转义字符:

                          和 C 语言类似, \ 在shell 中被用作转义字符,用于去除紧跟其后的单个字符的特殊意义(回车除外)。换句话说,紧跟其后的字符取字面值。例如:

                              例如:

                                       echo $SHELL

                                        /bin/bash

                 

                                        echo \ SHELL

                                        $SHELL

                       比如创建一个文件名为 “$ $” 的文件($ 间含有空格,可以这样):

                             touch  \$\ \$

                 (4)、单引号:

                          和 C 语言同, shell 脚本中的单引号和双引号一样都是字符串的界定符,而不是字符串的界定符。单引号用于保持引号内所有字符的字面值,即使引号的  \ 和回车也不例外,但是字符串中不能出现单引号,如果引号没有配对就输入回车,shell 会给出续行的提示符,要求用户把引号配上对。例如:

                           echo   `$SHELL`

                           $SHELL


                           echo `ABC\(回车)

                                  >DE'(回车)

                                   DE

                   (5)、双引号

                              被双引号扩住的内容,将被视为单一字串。它防止通配符扩展,但允许变量扩展。

                                          DATE=$(date)

                                          echo $DATE                        输出 日期

                                          echo "$DATE"                      输出 日期

                                          echo '$DATE'                      输出 $DATE

                                    

                                VAR=                                表示定义了一个环境变量VAR,它的值为null ,即字符串的长度为