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
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:表示当前执行的脚本或程序名称