23.2. �ֲ�����

��ô��ʹһ��������ɾֲ���?

�ֲ�����

���������local����������ô��ֻ���ڸñ��������������(block of code)�пɼ�. ����������Ǿֲ�"��Χ". ��һ�������ڣ��ֲ�������ζ��ֻ���ں��������������������.


���� 23-12. �ֲ������Ŀɼ���Χ

   1 #!/bin/bash
   2 # �ں����ڲ���ȫ�ֺ;ֲ�����.
   3 
   4 func ()
   5 {
   6   local loc_var=23       # ����Ϊ�ֲ�����.
   7   echo                   # ʹ���ڽ���'local'�ؼ���.
   8   echo "\"loc_var\" in function = $loc_var"
   9   global_var=999         # û������Ϊ�ֲ�����.
  10                          # Ĭ��Ϊȫ�ֱ���. 
  11   echo "\"global_var\" in function = $global_var"
  12 }  
  13 
  14 func
  15 
  16 # ���ڣ��������Ƿ�ֲ�����"loc_var"�ܷ��ں�������ɼ�.
  17 
  18 echo
  19 echo "\"loc_var\" outside function = $loc_var"
  20                                       # $loc_var outside function = 
  21                                       # ��, $loc_var����ȫ�ֿɷ��ʵ�.
  22 echo "\"global_var\" outside function = $global_var"
  23                                       # $global_var outside function = 999
  24                                       # $global_var ��ȫ�ֿɷ��ʵ�.
  25 echo				      
  26 
  27 exit 0
  28 #  ��In contrast to C���, �ں�����������Bash����ֻ����
  29 #+ ������ȷ�����ɾֲ��ı���ʱ���Ǿֲ���.

Caution

�ں�������֮ǰ�������ں�����������û����ȷ����Ϊlocal�ı��������ں�������ɼ�.
   1 #!/bin/bash
   2 
   3 func ()
   4 {
   5 global_var=37    #  �ں�����û�б�����ǰ
   6                  #+ ����ֻ�ں����ڿɼ�. 
   7 }                #  ��������
   8 
   9 echo "global_var = $global_var"  # global_var =
  10                                  #  ����"func"��û�б�����,
  11                                  #+ ���Ա���$global_var�����ܱ�����.
  12 
  13 func
  14 echo "global_var = $global_var"  # global_var = 37
  15                                  # �Ѿ��ں�������ʱ������ֵ.

23.2.1. �ֲ�����ʹ�ݹ��ÿ���.

�ֲ��������Եݹ�, [1] ������취����������ļ��㣬�������shell�ű����DZ���ȷ�������Ƽ���. [2]


���� 23-13. �þֲ��������ݹ�

   1 #!/bin/bash
   2 
   3 #               �׳�
   4 #               ---------
   5 
   6 
   7 # bash�����ݹ���?
   8 # ��, ����, ����...
   9 # ��̫����������������.
  10 
  11 
  12 MAX_ARG=5
  13 E_WRONG_ARGS=65
  14 E_RANGE_ERR=66
  15 
  16 
  17 if [ -z "$1" ]
  18 then
  19   echo "Usage: `basename $0` number"
  20   exit $E_WRONG_ARGS
  21 fi
  22 
  23 if [ "$1" -gt $MAX_ARG ]
  24 then
  25   echo "Out of range (5 is maximum)."
  26   #  �������������˽�ʵ�����.
  27   #  �����������������ķ�Χ�Ľ׳�,
  28   #+ Ӧ��������һ�������ı��������д.
  29   exit $E_RANGE_ERR
  30 fi  
  31 
  32 fact ()
  33 {
  34   local number=$1
  35   #  ����"number"��������Ϊ�ֲ�,
  36   #+ ���������Ṥ��.
  37   if [ "$number" -eq 0 ]
  38   then
  39     factorial=1    # 0�Ľ׳�Ϊ1.
  40   else
  41     let "decrnum = number - 1"
  42     fact $decrnum  # �ݹ����(�����ڲ������Լ�����).
  43     let "factorial = $number * $?"
  44   fi
  45 
  46   return $factorial
  47 }
  48 
  49 fact $1
  50 echo "Factorial of $1 is $?."
  51 
  52 exit 0

Ҳ��ο����� A-16�Ľű��ݹ������. ������ʶ���ݹ�Ҳ��ζ�ž޴����Դ���ĺͻ��������У���������ʺ��ڽű���ʹ��.

ע

[1]

Herbert Mayer ���ݹ��µĶ�����". . . expressing an algorithm by using a simpler version of that same algorithm(��һ����ͬ�㷨�İ汾����ʾһ���㷨) . . ." �ݹ麯���ǵ������Լ������ĺ���.

[2]

̫���ĵݹ���ܻ�����ű��δ��������.
   1 #!/bin/bash
   2 
   3 #  ����: ��������ű�����ʹ���ϵͳʧȥ��Ӧ!
   4 #  �������������������ʹ�������п����ڴ�֮ǰ��δ�����˳�.
   5 
   6 recursive_function ()		   
   7 {
   8 echo "$1"     # ʹ������Щ�����Լ��ٲ����δ���.
   9 (( $1 < $2 )) && recursive_function $(( $1 + 1 )) $2;
  10 #  ����һ�������ȵڶ���������ʱ,
  11 #+ �ѵ�1��������1�ٴεݹ�.
  12 }
  13 
  14 recursive_function 1 50000  # �ݹ� 50,000 ��!
  15 #  �dz����ܶδ��� (������ջ�Ĵ�С������ulimit -m����).
  16 
  17 #  ������ȵĵݹ������������ںľ�ջ���ڴ��С������C����Ķδ���.
  18 #
  19 
  20 
  21 echo "This will probably not print."
  22 exit 0  # ����ű����������������˳�.
  23 
  24 #  ��л, St�phane Chazelas.