case_esac 使用

利用case esac判断-针对既定变量

利用case esac判断-针对既定变量 --香港服务器租用
上个小节提到的『 if .... then .... fi 』对于变量的判断中, 是以比对的方式来分辨的,如果符合状
态就进行某些行为,并且透过较多层次 ( 就是 elif ... ) 的方式来进行多个变量的程序代码撰写,譬如
美国服务器租用商的sh08.sh 这个小程序,就是用这样的方式来的啰。 好,那么万一我有多个既定的变量内容,例如 sh08.sh
当中,我所需要的变量就是 "hello" 及空字符串两个, 那么我只要针对这两个变量来设定状况就好了对
吧?!那么可以使用什么方式来设计呢? 呵呵~就用 case ... in .... esac 吧~,他的语法如下:
case $变量名称 in
  "第一个变量内容")
  程序段
  ;;
  "第二个变量内容")
  程序段
  ;;
  *)
  不包含第一个变量内容与第二个变量内容的其它程序执行段
  exit 1
  ;;
esac
要注意的是,这个语法是以 case 为开头,而以 esac 为结尾,啥?为何是 esac 呢?想一想,既然 if 的
结尾是 fi ,那么 case 的结尾当然就是将 case 倒着写,自然就是 esac 啰~ ^_^,很好记吧~ 另外,
每一个变量内容的程序段最后都需要两个分号 (;;) 来代表该程序段落的结束,这挺重要的喔! 至于为何
需要有 * 这个变量内容在最后呢?这是因为,如果使用者不是输入变量内容一或二时, 我们可以告知使
用者相关的信息啊!美国服务器租用商就举例来说,我们如果将 sh08.sh 改写的话, 他应该会变成这样喔!
[root@linux scripts]# vi sh08-2.sh
#!/bin/bash
# Program:
#   Show "Hello" from $1.... by using case .... esac
# History:
# 2005/08/29  VBird  First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
 
case $1 in
  "hello")
  echo "Hello, how are you ?"
  ;;
  "")
  echo "You MUST input parameters, ex> $0 someword"
  ;;
  *)
  echo "Usage $0 {hello}"
  ;; esac
在上面这个 sh08-2.sh 的案例当中,如果你输入『 sh sh08-2.sh test 』来执行, 那么屏幕上就会出现
『Usage sh08-2.sh {hello}』的字样,告知执行者仅能够使用 hello 喔~ 这样的方式对于需要某些固定
字符串来执行的变量内容就显的更加的方便呢? 这种方式您真的要熟悉喔!这是因为系统的很多服务的启
动 scripts 都是使用这种写法的,国外服务器租用商举例来说,我们 Linux 的服务启动放置目录是在 /etc/init.d/ 当中,
我已经知道里头有个 syslog 的服务,我想要重新启动这个服务,可以这样做: 
/etc/init.d/syslog restart
重点是那个 restart 啦~如果您进入 /etc/init.d/syslog 就会看到他使用的是 case 语法, 并且会规
定某些既定的变量内容,你可以直接下达 /etc/init.d/syslog , 该 script 就会告知你有哪些后续接的
变量可以使用啰~方便吧! ^_^
一般来说,使用『 case $变量 in 』这个语法中,当中的那个 $变量 大致有两种取得的方式: 
?  直接下达式:例如上面提到的,利用『 script.sh variable 』 的方式来直接给予 $1 这个变量
的内容,这也是在 /etc/init.d 目录下大多数程序的设计方式。 
?  交互式:透过 read 这个指令来让使用者输入变量的内容。
这么说或许您的感受性还不高,好,我们直接写个程序来玩玩:让使用者能够输入 one, two, three , 并
且将使用者的变量显示到屏幕上,如果不是 one, two, three 时,就告知使用者仅有这三种选择。
[root@linux scripts]# vi sh11.sh
#!/bin/bash
# Program:
#   Let user input one, two, three and show in screen.
# History:
# 2005/08/29  VBird  First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
 
echo "This program will print your selection !"
# read -p "Input your choice: " choice
# case $choice in
case $1 in
  "one")
  echo "Your choice is ONE"
  ;;
  "two")
  echo "Your choice is TWO"
  ;;
  "three")
  echo "Your choice is THREE"
  ;;
  *)
  echo "Usage {one|two|three}"   ;;
esac
此时,您可以使用『 sh sh11.sh two 』的方式来下达指令,就可以收到相对应的响应了。 上面使用的是
直接下达的方式,而如果使用的是交互式时,那么将上面第 10, 11 行的 "#" 拿掉, 并将 12 行加上批
注 (#),就可以让使用者输入参数啰~这样是否很有趣啊?!

利用case esac判断-针对既定变量
上个小节提到的『 if .... then .... fi 』对于变量的判断中, 是以比对的方式来分辨的,如果符合状
态就进行某些行为,并且透过较多层次 ( 就是 elif ... ) 的方式来进行多个变量的程序代码撰写,譬如
美国服务器租用商的sh08.sh 这个小程序,就是用这样的方式来的啰。 好,那么万一我有多个既定的变量内容,例如 sh08.sh
当中,我所需要的变量就是 "hello" 及空字符串两个, 那么我只要针对这两个变量来设定状况就好了对
吧?!那么可以使用什么方式来设计呢? 呵呵~就用 case ... in .... esac 吧~,他的语法如下:
case $变量名称 in
  "第一个变量内容")
  程序段
  ;;
  "第二个变量内容")
  程序段
  ;;
  *)
  不包含第一个变量内容与第二个变量内容的其它程序执行段
  exit 1
  ;;
esac
要注意的是,这个语法是以 case 为开头,而以 esac 为结尾,啥?为何是 esac 呢?想一想,既然 if 的
结尾是 fi ,那么 case 的结尾当然就是将 case 倒着写,自然就是 esac 啰~ ^_^,很好记吧~ 另外,
每一个变量内容的程序段最后都需要两个分号 (;;) 来代表该程序段落的结束,这挺重要的喔! 至于为何
需要有 * 这个变量内容在最后呢?这是因为,如果使用者不是输入变量内容一或二时, 我们可以告知使
用者相关的信息啊!美国服务器租用商就举例来说,我们如果将 sh08.sh 改写的话, 他应该会变成这样喔!
[root@linux scripts]# vi sh08-2.sh
#!/bin/bash
# Program:
#   Show "Hello" from $1.... by using case .... esac
# History:
# 2005/08/29  VBird  First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
 
case $1 in
  "hello")
  echo "Hello, how are you ?"
  ;;
  "")
  echo "You MUST input parameters, ex> $0 someword"
  ;;
  *)
  echo "Usage $0 {hello}"
  ;; esac
在上面这个 sh08-2.sh 的案例当中,如果你输入『 sh sh08-2.sh test 』来执行, 那么屏幕上就会出现
『Usage sh08-2.sh {hello}』的字样,告知执行者仅能够使用 hello 喔~ 这样的方式对于需要某些固定
字符串来执行的变量内容就显的更加的方便呢? 这种方式您真的要熟悉喔!这是因为系统的很多服务的启
动 scripts 都是使用这种写法的,国外服务器租用商举例来说,我们 Linux 的服务启动放置目录是在 /etc/init.d/ 当中,
我已经知道里头有个 syslog 的服务,我想要重新启动这个服务,可以这样做: 
/etc/init.d/syslog restart
重点是那个 restart 啦~如果您进入 /etc/init.d/syslog 就会看到他使用的是 case 语法, 并且会规
定某些既定的变量内容,你可以直接下达 /etc/init.d/syslog , 该 script 就会告知你有哪些后续接的
变量可以使用啰~方便吧! ^_^
一般来说,使用『 case $变量 in 』这个语法中,当中的那个 $变量 大致有两种取得的方式: 
?  直接下达式:例如上面提到的,利用『 script.sh variable 』 的方式来直接给予 $1 这个变量
的内容,这也是在 /etc/init.d 目录下大多数程序的设计方式。 
?  交互式:透过 read 这个指令来让使用者输入变量的内容。
这么说或许您的感受性还不高,好,我们直接写个程序来玩玩:让使用者能够输入 one, two, three , 并
且将使用者的变量显示到屏幕上,如果不是 one, two, three 时,就告知使用者仅有这三种选择。
[root@linux scripts]# vi sh11.sh
#!/bin/bash
# Program:
#   Let user input one, two, three and show in screen.
# History:
# 2005/08/29  VBird  First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
 
echo "This program will print your selection !"
# read -p "Input your choice: " choice
# case $choice in
case $1 in
  "one")
  echo "Your choice is ONE"
  ;;
  "two")
  echo "Your choice is TWO"
  ;;
  "three")
  echo "Your choice is THREE"
  ;;
  *)
  echo "Usage {one|two|three}"   ;;
esac
此时,您可以使用『 sh sh11.sh two 』的方式来下达指令,就可以收到相对应的响应了。 上面使用的是
直接下达的方式,而如果使用的是交互式时,那么将上面第 10, 11 行的 "#" 拿掉, 并将 12 行加上批
注 (#),就可以让使用者输入参数啰~这样是否很有趣啊?!

作者: xxha000721   发布时间: 2010-09-28