标签:
大纲:
1-for循环补充
1-1-for循环实战---类C格式应用
2-break、continue循环控制符
2-1实战:帮助理解break、continue作用
3-函数详解
3-1、脚本文件中定义函数并引用,如上图
3-2、返回值的应用
3-3、向函数传递参数(使用位置参数)
3-4、全局变量和局部变量
3-5、向函数传递数组
3-6、调用其他模块的函数
4-shift命令,参数左移
4-1-实战:shift应用
#######################################
1- for循环补充
for循环除了前面讲过的 for [变量名] in [变量值列表] 的使用方式外,
还有一种类似与C语言的循环使用方式,如下:
Usage:
for((i=1;i<=10;i++))
do
#命令序列
done
===================================
1-1 for循环实战---类C格式应用
计算1~100的和
脚本源码:
#!/bin/bash      
# the total of 1~100
total=0
for (( i=1 ; i<=100 ; i++ ))      
do       
    total=$(expr  $total + $i )       
done
echo "1+2+3+...+100=$total"
执行结果:
#######################################
2- break、continue循环控制符
结束当前循环,继续下一个循环:continue
结束整个循环,执行这个循环后面的语句:break
===================================
2-1 实战:帮助理解break、continue作用
脚本源码:
#!/bin/bash      
# break continue
while [ true ]      
do       
    read -p "Enter :" input       
    case $input in       
        1)       
            echo "Hello world!"       
            continue       
            echo "Hello world!"       
            ;;       
        2)       
            echo "Ni Hao!"       
            ;;       
        3)       
            echo "I‘m XiaoGan!"       
            ;;       
        4)       
            echo "Exit!"       
            break       
            echo "Exit!"       
            ;;       
        *)       
            echo "Input { 1 | 2 | 3 | 4 }"       
            ;;       
    esac       
done
echo "The While Circle is Over!"
执行效果:
#######################################
3- 函数详解
函数的定义:
function [函数名] ()
{
#命令序列
}
#在函数和shell脚本中定义的变量都是相对于这个脚本来说的全局变量
#所以在函数内部,可以直接使用函数外部定义的变量
#在函数外部,可以直接读取函数内部定义的变量
如下图:
函数的几种用法:
===================================
3-1、脚本文件中定义函数并引用,如上图
===================================
3-2、返回值的应用
函数可以返回数值,其默认为上一条指令的执行结果
当然,我们也可以使用return语句,设置函数的返回值
但是,由于shell状态码最大是255,
当需要返回大于255的值时,需要将返回值复制与变量
脚本源码:
#!/bin/bash
function fun1()        
{         
    a=144         
    echo "in fun1() a=$a"         
}         
function fun2()         
{         
    b=144         
    echo "in fun2() b=$b"         
    return $b         
}         
function fun3()         
{         
    c=300         
    echo "in fun3() c=$c"         
    return $c         
}
#test value of fun1           
echo "test the return value of fun1 with return"           
fun1   
echo "The return value is $?"
echo ""        
#test the return value of fun2 <255         
echo "test the return value of fun2 <255"         
fun2         
echo "The return value is $?"
echo ""        
#test the return value of fun3 >255 value=fun3         
echo "test the return value of fun3 >255 value=fun3"         
# The return value output to value         
value=`fun3`         
echo "Value=\‘fun3\‘ is value=$value"
echo ""        
#test the return value of fun3 >255         
echo "test the return value of fun3 >255"         
fun3         
echo "The return value is $?"
执行结果
===================================
3-4、向函数传递参数(使用位置参数)
函数除了可以直接使用脚本的外部变量,
还可以使用调用函数是,传递的位置参数
在函数中,$@ --->代表,调用函数时,传递过来的所有位置参数组成的数组
$#在函数中,代表调用函数式,传递的参数个数
脚本源码:
#!/bin/bash        
# location arguments of function     
function fun1(){        
  echo "in fun1()"         
  echo "all location arguments is \$@:$@" #in function $@ stand of all location arguments"         
  if [ $# -ne 0 ]         
  then         
      echo " Location arguments number is $#."         
      while [ $# -gt 0 ]         
      do         
          echo $1         
          shift         
      done
  else        
      echo "No Location arguments."         
      return 1         
  fi         
  echo "will out fun1()"         
}         
ml="fun1"         
echo "in scripts out fun1() \$@:$@"         
echo "Test Location arguments of Function"         
while [ $# -gt 0 ]         
do         
    ml=$ml" $1"         
    shift         
done
#fun1 $1 $2 $3 11 12 13        
echo "ml is \"$ml\""         
$ml
===================================
3-5、全局变量和局部变量
#在函数和shell脚本中定义的变量都是相对于这个脚本来说的全局变量
#所以在函数内部,可以直接使用函数外部定义的变量
#在函数外部,可以直接读取函数内部定义的变量
#若想要定义局部变量可使用如下方式:
local [变量名]
脚本源码:
#!/bin/bash
function fun1()        
{         
    num1=123         
    local num3=110         
    echo "In fun1(),num2=$num2"         
    echo "In fun1(),num3=$num3"         
}         
num2=321
echo "num1 and local num3 in fun1(),num2 out fun2()"        
fun1         
echo "Out fun1(),num1=$num1"         
echo "Out fun1(),num3=$num3"
变量的作用域:
当函数内部和外部同时定义了相同的变量时,会相互影响
脚本源码:
#!/bin/bash      
function fun1(){       
  num=123       
  echo "in fun1() num=$num"       
}       
num=110       
echo "out fun1() num=$num"       
fun1       
echo "out fun1() num=$num"
所以,在函数中,尽量使用local局部变量
===================================
3-6、向函数传递数组
程序源码:
#!/bin/bash      
function array(){       
  echo parameters:"$@"       
  local factorial=1       
  for value in "$@"       
  do       
      factorial=$[ $factorial * $value ]       
  done       
  echo "factorial=$factorial"       
}       
a=(12 13 14 15 16)       
echo "a is ${a[*]}"       
echo "array \$(a{*}) start:"       
echo ""       
array ${a[*]}
注:定义数组:
array=(11 23 12 13 14)
输出数组:
echo ${array[*]}
===================================
3-8、调用其他模块的函数
将事先写好的函数模块调用在当前脚本中:
source [模块路径]
脚本源码:
#option.sh
#!/bin/bash        
# function define     
function copy(){        
    echo "in copy()"         
}
function add(){        
    echo "in add()"         
}
function delete(){        
    echo "in del()"         
}
function change(){        
    echo "in change()"         
}
     
function search(){        
    echo "in search()"         
}
function quit(){        
    echo "in exit()"         
}
#call.sh
#!/bin/bash        
source option.sh
cat <<EOF        
*******************************         
*            Menu             *         
*******************************         
*           1.copy            *         
*           2.add             *         
*           3.del             *         
*           4.change          *         
*           5.search          *         
*           6.exit            *         
*******************************         
EOF         
while [ true ]         
do         
    read -p "Enter your choose:" ent         
    case $ent in         
        1)         
            echo "copy"         
            copy         
            ;;         
        2)         
            echo "add"         
            add         
            ;;         
        3)         
            echo "delete"         
            delete         
            ;;         
        4)         
            echo "change"         
            change         
            ;;         
        5)         
            echo "search"         
            search         
            ;;         
        6)         
            echo "exit"         
            quit         
            ;;         
        *)         
            echo "Please ent:{ 1 | 2 | 3 | 4 | 5 | 6 }"         
            ;;         
    esac         
done
#######################################
4-shift命令,参数左移
在函数或者脚本中,有时候,为了方便的遍历位置参数,shift命令进行操作:
shift命令每执行一次,位置参数向左移移位:
===================================
4-1-实战:shift应用
shift #参数左移
脚本源码如下:
#!/bin/bash      
# shift       
total=0       
while [ $# -gt 0 ]       
do       
    total=$( expr $total + $1 )       
    shift       
done       
echo "total=$total"
拓展:seq 和awk命令的使用,计算1-100的和
seq 100 | awk ‘ { total=total+$1 } END {print total }‘
标签:
原文地址:http://www.cnblogs.com/xiaogan/p/5838458.html