shell脚本(1

  Shell脚本是一个特殊的应用程序,负责接收用户输入的操作命令并进行解释,将需要执行的操作传递给内核执行,并输出执行结果。可以在/etc/shells文件查看当前系统所支持的shell种类。

[root@localhost~]# cat /etc/shells

/bin/sh

/bin/bash

/sbin/nologin

/bin/tcsh

/bin/csh                                                                                                         

/bin/ksh

其中/bin/bash是目前大多数linux版本采用的默认shell,全称为Bourne AgainShell

 

脚本的二种执行方法

一、./first.sh     这种执行方法需要给first.sh脚本一个执行权限:chomod+x first.sh

二、sh /first.sh      这种执行方法不需要给first.sh脚本执行权限,也可通过Source“.”执行

         . first.sh 或者source/first.sh (中间都是有空格的)

  重定向与管道操作

标准输入(STDIN):默认:键盘 文件编号为0

标准输出(STDOUT):默认:显示器 文件编号为1

标准错误(STDERR):默认:显示器 文件编号为2

重定向输出>>>分别是覆盖和追加重定向

重定向输入<

重定向输入可用于给用户创建密码

[root@localhost~]#vim shelltest/useradd

123456

:x

 

[root@localhost~]# passwd --stdin jerry <shelltest/useradd

Changingpassword for user jerry.

passwd:all authentication tokens updated successfully.

这样可以省去创建密码时多次输入密码。

错误重定向2>2>>是覆盖和追加重定向

当一个命令即包括错误输出和标准输出时可以用&>把标准和错误输出到一个文件里

如自动编译安装httpd时要把make  make install操作全部指向/dev/null

[root@localhost~]# vim httpd.sh

#!/bin/bash

#httpdshell install

cd/var/ftp/pub/httpd-2.2.17/

./config--prefix=/usr/local/httpd --enable-so &>/dev/null

make&>/dev/null

makeinstall $>/dev/null

.....以下省略

执行这个脚本后编译安装时会把输出的文件全部指向/dev/null下。

管道符“ | ”位于管道符左侧的命令输出的结果,将作为右侧命令的输入。

如查看用“/bin/bash”作为shell的用户名称时可以用awk命令进一步过滤,只显示用户名和登录shell

过滤前会显示整行内容

[root@localhost~]# grep "/bin/bash$" /etc/passwd

root:x:0:0:root:/root:/bin/bash

jerry:x:500:500::/home/jerry:/bin/bash

过滤后只显示用户名和登录shell

[root@localhost~]# grep "/bin/bash$" /etc/passwd | awk -F: '{print$1,$7}'

root/bin/bash

jerry/bin/bash

上列中awk的作用是以:为分隔符输出第1列和第7列内容,-F是指定分隔符,可为文档中的任意字符,默认以空格或制表符分隔(大括号里的内容要用单引号)。

 

使用shell变量

常用的shell变量包括:自定义变量、环境变量、预定义变量、位置变量。

自定义变量是由系统用户自己定义的变量,只在用户自己的shell环境中有效,所以又称做本地变量。

定义变量的基本格式为变量名=变量值,等号两边没有空格。变量名称需要以字母或下划线开头,名称中不要包含特殊字符。

自定义变量如下:

[root@localhost ~]# system=centos

[root@localhost ~]# version=6.5

查看时用echo回显,变量名前要加上$符号

[root@localhost ~]# echo $system

centos

[root@localhost ~]# echo $system $version

centos 6.5

回显变量名时如果后边有其它字符需要添加大括号{}将其包围起来,否则将无法确定正确的变量名称。未定义的变量,将显示为空值。

[root@localhost ~]# echo $system6.5         #因未定义$system6所以只显示.5变量值为空

.5

[root@localhost ~]# echo ${system}6.5

centos6.5

变量赋值的特殊操作

在等号后边直接指定变量内容是为变量赋值的最基本方法,除此以外还有一些特殊的赋值操作,可以灵活地赋值变量,以便适用于复杂的管理任务。

1.双引号(“”

比如我们在赋值一个内容里包含空格时,必须用双引号括起来,如下

[root@localhost ~]# Centos=Centos6.5  错误的赋值提示没有这个命令

-bash: 6.5: command not found

[root@localhost ~]#Centos="Centos 6.5"

[root@localhost ~]# echo $Centos

Centos 6.5

2.$)符号

        在双引号范围内,使用“$”符号可以引用其它变量的值,如下

[root@localhost ~]# redhat="red hat$version"

[root@localhost ~]# echo $redhat

red hat 6.5

3.单引号(

         当要赋值的内容中包含$\等具有特殊含义的字符时,应使用单引号括起来,经单引号的范围内,将无法引用其他变量值,任何字符当做普通字符看待,但赋值的内容中包含单引号时,需要用“\”符号进行转义,以免冲突。如下

[root@localhost ~]# redhat='red hat $version'

[root@localhost ~]# echo $redhat

red hat $version

4.反撇号(`

         反撇号主要用于命令替换,允许将执行某个命令的屏幕输出结果赋值给变量,反撇号括起来的范围内必须是能够执行的命令行,否则会出错。如下

[root@localhost ~]# ls -ld `which service`

-rwxr-xr-x 1 root root 1744 2009-07-13/sbin/service

如上述命令相当于先执行which service然后查看文件属性相当于连续执行了两条命令。

但是使用反撇号不能在一行命令中实现嵌套命令替换操作,这时可以用“$()”来代替反撇号,以解决嵌套问题,如查看useradd命令程序的软件包安装的配置文件在什么位置,如下

[root@localhost ~]# rpm -qc $(rpm -qf $(whichuseradd))

/etc/default/useradd

/etc/login.defs

5.read命令

         Read命令是用来提示用户输入信息,从而实现简单的交互过程,将用户输入的内容赋值给指定的变量,多余的内容赋值给最后一个变量,若指定的变量只有一个,则将整行内容赋值给此变量。如下操作会等待用户输入,并将用户输入内容赋值给变量

[root@localhost ~]# read dir

/opt/backup

[root@localhost ~]# echo $dir

/opt/backup

         Read命令还可以结合”-p”选项来设置提示信息,如下

[root@localhost ~]# read -p "请指定备份的存放目录:" dir

请指定备份的存放目录:/opt/backup/

[root@localhost ~]# echo $dir

/opt/backup/

之前说过自定义变量都只能在自己的shell里才能用称为局部变量,其实我们可以把局部变量变为全局变量。如下。

[root@localhost ~]# echo "$system$version"

centos 6.5

[root@localhost ~]# export system version   #设置为全局变量

[root@localhost ~]# bash                 #进入子shell环境

[root@localhost ~]# echo "$system$version"       

centos 6.5

export也可以在创建变量时直接创建为全局变量如下

[root@localhost ~]# exportfqnd="www.baidu.com"

[root@localhost ~]# bash

[root@localhost ~]# echo $fqnd

www.baidu.com

5.数值变量运算

Expr用于shell里简单的整数运算

运算符与变量之间至少要有一个空格。

expr 变量1 运算符 变量2 [运算符 变量3]……

运算符包括以下几种

+:加法                     -:减法          \*:乘法       /:除法         %:取余运算

x=5 y=3

[root@localhost ~]# x=5

[root@localhost ~]# y=3

[root@localhost ~]# expr        $x    %       $y

2

特殊变量之环境变量

环境变量指的是出于运行需要由linux系统提前创建的一类变量,主要用于设置用户的工作环境,如宿主目录,命令查找路径,用户当前目录等。使用env可以查看当前工作环境下的环境变量。

[root@localhost ~]# env |more

HOSTNAME=localhost.localdomain

version=6.5

TERM=linux

SHELL=/bin/bash

HISTSIZE=200

KDE_NO_IPV6=1

……………..省略

 

PATH是用于设置可执行程序的默认搜索路径。如first.sh/root/下可用PATH添加,如下

[root@localhost ~]#PATH="$PATH:/root"

[root@localhost ~]# echo $PATH

/usr/lib/qt-3.3/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/root

 

Linux中环境变量的全局配置文件在/etc/profile,在此文件中定义的变量作用于所有用户,而每个用户还有自己独立的配置文件(~/.bash_profile,如变更历史命令由1000改为20,

[root@localhost ~]#vim /etc/profile

……//省略

HISTSIZE=20

[root@localhost ~]# source /etc/profile          使其配置生效

[root@localhost ~]# history |wc –l         

20

特殊变量之位置变量

位置变量当执行命令脚本时,第一个字段表示命令名或脚本名,其余字符串参数从左至右的顺序依次赋值给位置变量,如下

[root@localhost ~]# vi export.sh

#!/bin/bash

########位置变量运算脚本#######

SUM=`expr $1 \* $2`

echo "$1 \* $2 = $SUM"

[root@localhost ~]# sh expr.sh 5 6

5 \* 6 = 30

特殊变量之预定义变量

预定义变量是程序以经定义好的变量,用户不能手动创建也不能直接赋值给预定义变量

常见预定义变量

$#:表示命令行中位置参数的个数

$*:表示所有位置参数的内容

$?:表示上一条命令执行后的状态,返回0为正确其它值均为异常

$0:表示当前执行的脚本或程序名称