有的时候case能对参数进行过滤,如下例子:

 
  
  1. #!/bin/bash 
  2.  
  3. case "$1" in 
  4. "") echo "Usage: ${0#.} <filename>"; exit $E_PARAM;; 
  5.  
  6. # 注意:${0##*/} 是${var##pattern} 的一种替换形式。得到的结果是$0 
  7.  
  8. -*) FILENAME=./$1;;  #如果传递进来的文件名参数($1)以一个破折号开头 
  9.                      #那么用./$1来代替。这样后边的命令将不会将它作 
  10.                      #为一个选项来解释。 
  11. *) FILENAME=$1;;     #否则,$1. 
  12.  
  13. esac 
  14. echo $FILENAME 
  15. exit 0 
  16. [root@localhost shell]# cat 20 
  17. #!/bin/bash 
  18.  
  19. case "$1" in 
  20. "") echo "Usage: ${0#.} <filename>"; exit $E_PARAM;; 
  21.  
  22. # 注意:${0##*/} 是${var##pattern} 的一种替换形式。得到的结果是$0 
  23.  
  24. -*) FILENAME=./$1;;  #如果传递进来的文件名参数($1)以一个破折号开头 
  25.                      #那么用./$1来代替。这样后边的命令将不会将它作 
  26.                      #为一个选项来解释。 
  27. *) FILENAME=$1;;     #否则,$1. 
  28.  
  29. esac 
  30. echo $FILENAME 
  31. exit 0 

   select的用法:

 
  
  1. #!/bin/bash 
  2.  
  3. PS3='Choose your favorite vegetable: ' # 设置提示符字串. 
  4.  
  5. echo 
  6.  
  7. select vegetable in "beans" "carrots" "potatoes" "onions" "rutabagas" 
  8. do 
  9.   echo 
  10.   echo "Your favorite veggie is $vegetable." 
  11.   echo "Yuck!" 
  12.   echo 
  13.   break  # 如果这里没有 'break' 会发生什么? 
  14. done 
  15.  
  16. exit 0 

   运行会有如下输出:

 
  
  1. [max@localhost shell]$ ./21 
  2.  
  3. 1) beans 
  4. 2) carrots 
  5. 3) potatoes 
  6. 4) onions 
  7. 5) rutabagas 
  8. Choose your favorite vegetable: 1 #输入1 
  9.  
  10. Your favorite veggie is beans. 
  11. Yuck! 

也可以用函数参数的形式给select传递参数:

 
  
  1. #!/bin/bash 
  2.  
  3. PS3='Choose your favorite vegetable: ' 
  4.  
  5. echo 
  6.  
  7. choice_of() 
  8. select vegetable 
  9. # [in list]被忽略, 所以'select'使用传递给函数的参数. 
  10. do 
  11.   echo 
  12.   echo "Your favorite veggie is $vegetable." 
  13.   echo "Yuck!" 
  14.   echo 
  15.   break 
  16. done 
  17.  
  18. choice_of beans rice carrots radishes tomatoes spinach 
  19. #         $1    $2   $3      $4       $5       $6 
  20. #         传递给choice_of()的参数 
  21.  
  22. exit 0 

   当一个命令或者是shell本身需要初始化(或者创建)一个新的子进程来执行一个任务的时候, 这种行为被称为fork. 这个新产生的进程被叫做子进程, 并且这个进程是从父进程fork出来的. 当子进程执行它的任务时, 父进程也在运行.

注意: 当父进程获得了子进程进程ID时, 父进程可以给子进程传递参数, 然而反过来却不行.

   如下例子:

 
  
  1. #!/bin/bash 
  2. #spawn.sh 
  3.  
  4.  
  5. PIDS=$(pidof sh $0) 
  6. P_array=( $PIDS ) 
  7. echo $PIDS 
  8. let "instances = ${#P_array[*]} - 1" 
  9.  
  10. echo "$instances instance(s) of this script running." 
  11. echo "[Hit Ctl-C to exit]"; echo 
  12.  
  13.  
  14. sleep 1 #等一下 
  15. sh $0 
  16.  
  17. exit 0  #没必要,脚本永远不会运行到这里。 

    通常情况下, 脚本中的Bash内建命令在运行的时候是不会fork出一个子进程的. 但是脚本中的外部或者过滤命令通常fork出一个子进程.