一、 Shell和Shell Script
从程序员的角度来看, Shell本身是一种用C语言编写的程序,从用户的角度来看,Shell是用户与Linux操作系统沟通的桥梁。用户既可以输入命令执行,又可以利用 Shell脚本编程,完成更加复杂的操作。在Linux GUI日益完善的今天,在系统管理等领域,Shell编程仍然起着不可忽视的作用。深入地了解和熟练地掌握Shell编程,是每一个Linux用户的必修功课之一。
Linux的Shell种类众多,常见的有:Bourne Shell(/usr/bin/sh或/bin/sh)、Bourne Again Shell(/bin/bash)、C Shell(/usr/bin/csh)、K Shell(/usr/bin/ksh)、Shell for Root(/sbin/sh),等等。不同的Shell语言的语法有所不同,所以不能交换使用。每种Shell都有其特色之处,基本上,掌握其中任何一种 就足够了。在本文中,我们关注的重点是Bash,也就是Bourne Again Shell,由于易用和免费,Bash在日常工作中被广泛使用;同时,Bash也是大多数Linux系统默认的Shell。
Shell script是利用shell的功能所写的一个“程序”,这个程序是使用纯文本文件,将一些Linux Shell的语法与命令(含外部命令)写在里面,搭配正则表达式、管道命令与数据流重定向等功能,以达到我们所想要的处理目的。Shell script提供数组、循环、条件与逻辑判断等重要功能,让用户也可以直接以shell来编写程序,而不必使用类似C程序来完成相关功能。
二、 Shell实例和执行
[lingyun@centos6 ~]$ vim hello.sh
#!/bin/bash
#This is a sample shell script
str="Hello World!"
echo $str
var1=5
var2=6
total=`expr $var1 + $var2`
echo "total=$total"
var=${str}${var1}
echo $var
编译方法1:
[lingyun@centos6 ~]$ bash hello.sh
编译方法2:
[lingyun@centos6 ~]$ chmod a+x hello.sh
[lingyun@centos6 ~]$ ./hello.sh
总结:
- #! 告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 程序
- Shell Script是一种弱类型语言,使用变量的时候无需首先声明其类型,也无需事先定义;
- Shell在对变量取值的时候要在变量名前加$
三、 Shell条件判断
#!/bin/sh
# gt(>) lt(<) eq(=) ge(>=) le(<=)
var=5
if [ $var -gt 5 ] ; then
echo "var greater than 5"
elif [ $var -eq 5 ] ; then
echo "var equal to 5"
elif [ $var -lt 5 ] ; then
echo "var less than 5"
if 空格 [ 空格 XX 空格 ] ;then (一定要有空格,否则出错)
# Greater than >
# Little than <
# Equal =
常见的字符判断:
1、 字符串判断:
str1 = str2 当两个串有相同内容时为真
str1 != str2 当串str1和str2不等时为真
-n str1 当串的长度大于0时为真(串非空)
-z str1 当串的长度为0时为真(空串)
str1 当串str1为非空时为真
2、 数字的判断:
int1 -eq int2 两数相等为真
int1 -ne int2 两数不等为真
int1 -gt int2 int1大于int2为真
int1 -ge int2 int1大于等于int2为真
int1 -lt int2 int1小于int2为真
int1 -le int2 int1小于等于int2为真
3、 文件的判断
-r file 用户可读为真
-w file 用户可写为真
-x file 用户可执行为真
-f file 文件为正规文件为真
-d file 文件为目录为真
-c file 文件为字符设备文件为真
-b file 文件为块设备文件为真
-s file 文件大小非0时为真
4、 复杂逻辑判断:
-a 与
-o 或
! 非
四、 Shell switch/case
#!/bin/bash
SYSTEM=`uname -s`
case $SYSTEM in
Linux)
echo "Linux System"
;;
FreeBSD)
echo "FreeBSD System"
;;
Solaris)
echo "Solaris System"
;;
*)
echo "Unknow System"
;;
esac
五、 Shell循环
for循环:
for xxx in xxx ; do
xxx
done
#!/bin/bash
echo "Use for list 1~10"
for i in `seq 1 10` ; do
echo $i
done
echo "List file in current folder:" #打印使用ls命令后的字符串
for file in `ls`
do
echo $file
done
while循环:
#!/bin/bash
echo "Use while list 1~10"
min=1
max=10
while [ $min -le $max ]
do
echo $min
min=`expr $min + 1`
done