01 Shell入门基础

来源:互联网 发布:php安装sqlsrv扩展 编辑:程序博客网 时间:2024/05/16 02:56
1.1 什么是Shell
1973年,使用C语言重写编写了Unix。通过这次编写,使得Unix得以移植到其他的小型机上面。
1979年,第一个重要的标准UNIX Shell在Unix的第7版中推出,并以作者史蒂夫•伯恩(Stephen Bourne)的名字命名,叫做Bourne Shell,简称为sh。

20世纪70年代末,C Shell作为2BSD UNIX的一部分发布,简称csh。
之后又出现了许多其他的Shell程序,主要包括Tenex C Shell(tcsh)、Korn Shell(ksh)以及GNU Bourne-Again shell(bash)。
Shell又称命令解释器,它能识别用户输入的各种命令,并传递给操作系统。它的作用类似于Windows操作系统中的命令行,但是,Shell的功能远比命令行强大的多。在UNIX或者Linux中,Shell既是用户交互的界面,也是控制系统的脚本语言

Bourne Shell:标识为sh,该Shell由Steve Bourne在贝尔实验室时编写。在许多Unix系统中,该Shell是root用户的默认的Shell。
Bourne-Again Shell:标识为bash,该Shell由Brian Fox在1987年编写,是绝大多数Linux发行版的默认的Shell。
Korn Shell:标识为ksh,该Shell由贝尔实验室的David Korn在二十世纪八十年代早期编写。它完全向上兼容 Bourne Shell 并包含了C Shell 的很多特性。
C Shell:标识为csh,该Shell由Bill Joy在BSD系统上开发。由于其语法类似于C语言,因此称为C Shell。

1.2 作为程序设计语言的Shell

通常情况下,Shell脚本程序有两种执行方式:交互式执行和作为程序文件执行。

[root@linux ~]# for filename in `ls .`
 > do
 > if echo "$filename" | grep "xml"
 > then
 > echo "$filename“
 > fi
 > done
对于一组需要经常重复执行的Shell语句来说,将它们保存在一个文件中来执行是一个非常明智的做法。我们通常称这种包含多个Shell语句的文件为Shell脚本,或者Shell脚本文件。脚本文件都是普通的文本文件,可以使用任何的文本编辑器查看或者修改Shell脚本文件

#! /bin/sh

#for循环开始
for filename in `ls .`
do
      #如果文件名包含xml
      if echo "$filename" | grep "xml"
      then
            #输出文件名
            echo "$filename"
      fi
done

当将脚本编辑完成之后,这个脚本还不能马上可以执行。在Linux中,当用户执行某个程序时,必须拥有该文件的执行权限。
用户可以通过chmod命令修改文件的权限属性。
chmod [options] filename
例如,下面的操作授予文件ex1-2.sh的所有者执行权限:
[root@linux chapter1]# chmod u+x ex1-2.sh
[root@linux chapter1]# ll
total 4
-rwxr--r--    1    root    root    116    Dec 18 23:11    ex1-2.sh
当授予用户执行权限之后,就可以执行该脚本了,如下:
[root@linux ~]# chapter1/ex1-1.sh

1.3 向脚本传递参数
许多情况下,Shell脚本都需要接收用户的输入,根据用户输入的参数来执行不同的操作。本节将介绍Shell脚本的参数以及如何在脚本中接收参数。
从命令行传递给Shell脚本的参数又称为位置参数,这主要是因为Shell脚本会根据参数的位置来接收它们的值。
$#   命令行参数的个数
$0   当前脚本的名称
$*   以"参数1 参数2 参数3 ..."的形式返回所有参数的值
$@   以"参数1""参数2""参数3"...的形式返回所有参数的值
$_   保存之前执行的命令的最后一个参数
$n   表示传递给脚本的第n个参数,例如$1表示第一个参数,$2表示第二个参数
$$   返回本进程的PID

#! /bin/bash
echo "\"$# parameters\""
echo "$@"

[root@linux chapter1]# ./ex1-3.sh a "b c"
"2 parameters"
a b c

1.4  参数扩展
参数扩展是通过选项名称来获取选项的值,而不是依靠参数的位置。用户可以通过getopts命令来获取选项的值。
#!/bin/bash

#输出参数索引
echo "OPTIND starts at $OPTIND"
## 声明OPTIND为局部变量
local OPTIND
#接收参数
while getopts ":pq:" optname
   do
   case "$optname" in
      "p")
         echo "Option $optname is specified"
         ;;
      "q")
         echo "Option $optname has value $OPTARG"
         ;;
      "?")
         echo "Unknown option $OPTARG"
         ;;
      ":")
         echo "No argument value for option $OPTARG"
         ;;
      *)
         # Should not occur
         echo "Unknown error while processing options"
         ;;
   esac
   echo "OPTIND is now $OPTIND"
done


[root@linux chapter1]# ./ex1-4.sh -p
OPTIND starts at 1
Option p is specified
OPTIND is now 2
[root@linux chapter1]# ./ex1-4.sh -q
OPTIND starts at 1
No argument value for option q
OPTIND is now 2
[root@linux chapter1]# ./ex1-4.sh -f
OPTIND starts at 1
Unknown option f
OPTIND is now 2

1.5 第一个Shell程序
Hello,Bash Shell!

1.5.1  Shell脚本的基本元素
对于一个基本的Shell程序来说,应该拥有以下基本元素:
    第1行的“#! /bin/bash”。
    注释:说明某些代码的功能。
    可执行语句:实现程序的功能。
#! /bin/bash

#输出字符串
echo "Hello Bash Shell!"

1.5.2  指定命令解释器
命令解释器用来解释并执行当前脚本文件中的语句,语法:
#! path
例如:#! /bin/bash

在PHP脚本文件中指定PHP语言的解释器,然后执行文件中的PHP代码。
#! /usr/local/php5/bin/php

<?php
   //输出Hello world!字符串
   print "Hello world!";
?>

1.5.3  Shell脚本中的注释和风格
通过在代码中增加注释可以提高程序的可读性。传统的Shell只支持单行注释,其表示方法是一个井号“#”,从该符号开始一直到行尾都属于注释的内容。
例如:
#注释1
#注释2
#注释3
...

用户还可以通过其他的一些变通的方法来实现多行注释,其中,最简单的方法就是使用冒号“:”配合here document,其语法如下:
:<<BLOCK

....注释内容

BLOCK

#! /bin/sh

:<<BLOCK
本脚本的作用是输出一行字符串
作者:chunxiao
BLOCK
echo "Hello world!"

1.5.4  如何执行Shell程序
在Linux中,如果要执行某个Shell程序,用户可以通过3种方式来实现。这3种方式分别为:
    授予用户执行该脚本文件的权限,使得该程序能够直接执行。
    通过调用Shell脚本解释器来执行。
    通过source命令来执行。
source命令是一个Shell内部命令,其功能是读取指定的Shell程序文件,并且依次执行其中的所有的语句。该命令与前面2种方式的区别在于只是简单地读取脚本里面的语句,并且依次在当前的Shell里面执行,并没有创建新的子Shell进程。脚本里面所创建的变量都会保存到当前的Shell里面。

1.5.5  Shell程序的退出状态
在UNIX或者Linux中,每个命令都会返回一个退出状态码。退出状态码是一个整数,其有效范围为0~255。通常情况下,成功的命令返回0,而不成功的命令返回非0值。非0值通常都被解释成一个错误码。行为良好的UNIX命令,程序和工具都会返回0作为退出码来表示成功。
Shell脚本中的函数和脚本本身也会返回退出状态码。在脚本或者是脚本函数中执行的最后的命令会决定退出状态码。另外,用户也可以在脚本中使用exit语句将指定的退出状态码传递给Shell。
#!/bin/sh

echo "hello world"
#退出状态为0, 因为命令执行成功.  
echo $?    
#无效命令.
abc
#非零的退出状态, 因为命令执行失败.
echo $?    
echo
#返回120退出状态给shell.  
exit 120

[root@linux chapter1]# ./ex1-9.sh
hello world
0
./ex1-9.sh: line 8: abc: command not found
127
 
[root@linux chapter1]# echo $?
120

0 0
原创粉丝点击