Chinaunix首页 | 论坛 | 博客
  • 博客访问: 42692
  • 博文数量: 16
  • 博客积分: 1410
  • 博客等级: 上尉
  • 技术积分: 200
  • 用 户 组: 普通用户
  • 注册时间: 2006-03-09 17:43
文章分类
文章存档

2011年(1)

2009年(13)

2008年(2)

我的朋友

分类:

2009-02-13 16:04:08

BASH SHELL
因为命令行输入命令时,每次输入一次命令,就可以得到系统的一次响应。如果需要一次性执行多个命令,可以把命令行写到一个脚本里面,让脚本批次完成,这个脚本就是shell脚本。
1、创建一个简单的shell脚本
 例:

#cat   test.sh

#! /bin/sh

    # this is test script

echo “hello everybody!”
  说明:linux的注释是以“#”开头的。
        #!/bin/sh  告诉内核,这是一个sh脚本

         # this is test script  脚本说明

  echo “hello everybody!”  脚本中执行的bash命令

2、使脚本具可执行权限
#chmod +x test.sh
3、执行脚本
#./test.sh

  hello everybody!

可以通过sh命令去执行脚本,查看脚本的执行过程
例:
#sh –x test.sh
4、参数
$0   脚本的名字
$!       脚本
$?   指上一条命令所执行的结果,如果结果为真,返回值为”0”如果执行不成功”1”
$#   指传递级脚本的总的参数数目
$*   执行脚本时,传递给脚本的所有参数组成的一个字符串
$$   当前进程的进程号
$!   后台运行的最后一个进程号
$1   执行脚本时,传递给脚本的第一个参数
$2   执行脚本时,传递给脚本的第一个参数
$N   执行脚本时,传递给脚本的第N个参数
用户定义的变量
 变量名=变量值
  要注意的一点是,在定义变量时,变量名前不应加符号“$”,在引用变量的内容时则应在变量名前加“$”;在给变量赋值时,等号两边一定不能留空格,若变量中本身就包含了空格,则整个字符串都要用双引号括起来

   如:abc=123456789     ss=”   4567    “

例:
[root@oracle /]# cat test.sh
#! /bin/sh
su - -c "date"
abc=123456
echo $0
echo $1
echo $2
echo $#
echo $*
echo $abc
echo "this is test "
[root@oracle /]# sh -x test.sh 123 abc
+ su - -c date
三  5月  7 14:30:30 CST 2008
+ echo test.sh
test.sh
+ echo 123
123
+ echo abc
abc
+ echo 2
2
+ echo 123 abc
123 abc
+ echo 123456
123456
+ echo 'this is test '
this is test

注:其中su - -c "date",这是调用root用户环境来执行date命令

    如:su – oracle –c “lsnrctl start”  这个是调用oracle用户环境执lsnrctl start命令
5、变量表达式

数值比较:
   -eq:等于则为真      "-eq      ="
   -ne:不等于则为真   "–ne      <"
   -gt:大于则为真       "-gt       >"
   -ge:大于等于则为真 "–ge   >="
   -lt:小于则为真         "–lt      <"
   -le:小于等于则为真  "-le   =<"
字符串比较:

   =:等于则为真

   !=:不相等则为真
   -z字符串:字符串长度伪则为真
   -n字符串:字符串长度不伪则为真

文件测试
   -e文件名:如果文件存在则为真
   -r文件名:如果文件存在且可读则为真
   -w文件名:如果文件存在且可写则为真
   -x文件名:如果文件存在且可执行则为真
   -s文件名:如果文件存在且至少有一个字符则为真
   -d文件名:如果文件存在且为目录则为真
   -f文件名:如果文件存在且为普通文件则为真
   -c文件名:如果文件存在且为字符型特殊文件则为真
   -b文件名:如果文件存在且为块特殊文件则为真

 
     注:变量表达式两边都要有空格,如 if [ $abc = “12345” ];then
“-o “ “-a”
[root@ftpserver ~]# [ 1 -lt 3 -o 2 -gt 3 ];echo $?   -o  或
0
[root@ftpserver ~]# [ 1 -lt 3 -a 2 -gt 3 ];echo $?   -a   和
1
6、控制语句:

if条件语句
   shell程序中的条件分支是通过if条件语句来实现的,其一般格式为:
       if条件命令串
       then
       条件为真时的命令串
      else
       条件为假时的命令串
       fi

例:
  cat test.sh
#! /bin/sh

if [ $1 = ”  ” ];then            注:[ ] 两边有空格

echo “没有参数输入”

else

echo “$1”

fi
 for循环
     for循环对一个变量的可能的值都执行一个命令序列。赋给变量的几个数

值既可以在程序内以数值列表的形式提供,也可以在程序以外以位置参数的形式提供。for循环的一般格式为:
   for变量名
   [in数值列表]
   do
   若干个命令行
   done
   变量名可以是用户选择的任何字符串,如果变量名是var,则在in之后给出的数值将顺序替换循环命令列表中的$var。如果省略了in,则变量var的取值将是位置参数。对变量的每一个可能的赋值都将执行do和done之间的命令列表。

 例:显示系统的所有用户
   [root@openvz ~]# cat test.sh

#! /bin/sh

i=1

for aaa in `cat /etc/passwd|awk -F ":" '{print $1}'`

 do
  
   echo "the NO.$i is:  $aaa";
   i=`expr $i + 1`
 done
 [root@openvz ~]#
 注:数字相加是使用expr命令,算法符号两边一定要有空格:
        expr 3 + 4        let t=3+4;echo $t+
expr 6 - 4
expr 20 * 4
expr 100 / 4
 

while和until循环
   while和until命令都是用命令的返回状态值来控制循环的。While循环的    

一般格式为:
   while
   若干个命令行1
   do
   若干个命令行2
   done
      只要while的“若干个命令行1”中最后一个命令的返回状态为真,while

循环就继续执行do...done之间的“若干个命令行2”。
例:计算1+2+3………………..100

[root@openvz ~]# cat test.sh

#! /bin/sh

#sum 1+2+3................+100

i=1
j=0

while true

 do

   j=`expr $j + $i`

   i=`expr $i + 1`

   if [ $i = 101 ]

   then
     echo $j;
     exit 0;
   fi
 done

[root@openvz ~]#

   until命令是另一种循环结构,它和while命令相似,其格式如下:
   until
   若干个命令行1
   do
   若干个命令行2
   done
      until循环和while循环的区别在于:while循环在条件为真时继续执行

循环,而until则是在条件为假时继续执行循环。


      Shell还提供了true和false两条命令用于建立无限循环结构的需要,

它们的返回状态分别是总为0或总为非0

  case条件选择
      if条件语句用于在两个选项中选定一项,而case条件选择为用户提供   

了根据字符串或变量的值从多个选项中选择一项的方法,其格式如下:
   case string in
   exp-1)
   若干个命令行1
   ;;
   exp-2)
   若干个命令行2
   ;;
   ……
   *)
   其他命令行
   esac
      shell通过计算字符串string的值,将其结果依次和表达式exp-1、exp-2

等进行比较,直到找到一个匹配的表达式为止,如果找到了匹配项则执行

它下面的命令直到遇到一对分号(;;)为止。
      在case表达式中也可以使用shell的通配符(“*”、“?”、“[ ]”)。通常

用“*”作为case命令的最后表达式以便使在前面找不到任何相应的匹配项
时执行“其他命令行”的命令。
例:
case "$1" in
        start)
                start
                ;;
        stop)
                stop
                ;;
        restart)
                stop
                start
                ;;
        *)

                Echo $"Usage: $0 {start|stop|restart}"

                RETVAL=1

esac
 无条件控制语句break和continue
       break用于立即终止当前循环的执行,而contiune用于不执行循环中

后面的语句而立即开始下一个循环的执行。这两个语句只有放在do和
done之间才有效。
7、数组

   [root@openvz /]# cat test.sh

#! /bin/sh

declare -a CC

CC[0]="redflag "

CC[1]="is"
CC[2]="very"
CC[3]="good"

CC[4]="linux CO."

 

for i in "${CC[@]}"

do

  echo "$i  "

done
[root@openvz /]# ./test.sh
redflag  
is 
very 
good 
linux CO.
8、四则运算
[root@ftpserver ~]# let t=3*3
[root@ftpserver ~]# echo $t
9
[root@ftpserver ~]# let t=3**3        平方
[root@ftpserver ~]# echo $t
27
[root@ftpserver ~]# let t=3+4*4/2**2-10
[root@ftpserver ~]# echo $t
-3
[root@ftpserver ~]#

打印 0 到 20

#! /bin/sh

for i in `seq 0 20

  do
    echo $i
  done

打印 a 到 z

#! /bin/sh

for i in `echo { a..z}`

 do
  echo $i
 done

打印 A 到 Z

#! /bin/sh

for i in `echo { A..Z}`

 do
  echo $i
 done

打印 0 到 20

#! /bin/sh

i=0

while [ $i -le 20 ]

do
  echo $i
  let i=$i+1
done
阅读(1277) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~