2012年8月23日星期四

shell脚本与c语言对比学习

http://blog.csdn.net/xj178926426/article/details/6923745


最近由于工作的关系,粗略的接触到一点脚本,之前也接触过,只是之前没有写过,只是偶尔自己加几句话怎么的。今天自己动手写啦一下,把shell对比于C语言的一些不同写在这里,当作自己学习的一个笔记,如果有不足之处还望各位牛人指出。
           不说这么多的废话吧,还是直接上代码:
[plain] view plaincopy
  1. #!/bin/sh  
  2. start_command()  
  3. {  
  4.         echo "the first argument is :" $1   
  5.         do_it()  
  6.         {  
  7.                 local rc=0  
  8.                 echo "I just test !"  
  9.                 echo "Input Error !"  
  10.         }  
  11.         while [ 1 ] ; do  
  12.         read finished  
  13.         case $finished in  
  14.         1) echo "your input is 1 !" ;;  
  15.         2) echo "your input is 2 !" ;;  
  16.         q) echo "quit successful !"   
  17.            break ;;  
  18.         *) do_it ;;  
  19.         esac  
  20.         done  
  21. }  
  22.   
  23. start_command "hello world !"  
  24. exit 0  

 
程序运行的结果:
[plain] view plaincopy
  1. the first argument is : hello world !  
  2. 1  
  3. your input is 1 !  
  4. 2  
  5. your input is 2 !  
  6. 3  
  7. I just test !  
  8. Input Error !  
  9. 2  
  10. your input is 2 !  
  11. 1  
  12. your input is 1 !  
  13. q  
  14. quit successful !  

 
由于自己没有系统的看过shell语法的书,在这里只是简单的把shell的语法类比于C语言的来学习。通过这上面一个简单的例子,我主要归纳出啦下面3点得不同。
          1shell中函数的定义与函数的调用。
          在shell中,函数的定义不需要像在C语言中那样要指明函数的返回值类型,函数的参数个数以及每个参数的类型。
写到这里大家首先会想到难道shell中的函数都没有返回值么?不是,shell中的函数可以有返回值的,下面我通过自己总结的两个方法来讲解:1echo法,2)全局变量法。
         1)echo
在被调用函数中需要返回的值,使用echo将其显示至stdout,然后在调用的地方再使用`func var1`获得stdout中的值,获得值可以直接赋值给变量。例如:
[plain] view plaincopy
  1. #!/bin/bash  
  2. #  echo法,返回一个字符串的长度  
  3. varCnt()  
  4. {  
  5.         var=$1  
  6.         ret=0  
  7.         if [ "$var" != "" ] ; then  
  8.                 ret=${#var}  
  9.         fi  
  10.         echo $ret  
  11.   
  12. }  
  13.   
  14. main()  
  15. {  
  16.         printf "varCnt's 's return value is %s "  `varCnt ""`  
  17.         printf "varCnt's 's return value is %s "  `varCnt "12345678"`  
  18.   
  19. }  
  20.   
  21. main  
  22.   
  23. exit  0  

程序运行结果:
[plain] view plaincopy
  1. root@james-desktop:/home/workspace/mycode# ./testecho.sh   
  2. varCntGlobeVar's 's return value is 0 varCntGlobeVar's 's return value is 8   

 
             2)全局变量法
  这个比较简单,声明一个全局变量 declare -i g_ret ,在function的返回值存储在全局变量中。调用处在函数执行完后,使用就可以了。例如:
[plain] view plaincopy
  1. #!/bin/bash  
  2.   
  3. #  全局变量法,返回一个字符串的长度  
  4. varCntGlobeVar()  
  5. {  
  6.         var=$1  
  7.         if [ "$var" != "" ] ; then  
  8.                 g_ret=${#var}  
  9.         fi  
  10. }  
  11.   
  12. main()  
  13. {  
  14.         declare -i g_ret=0  
  15.         varCntGlobeVar ""  
  16.         printf "varCntGlobeVar's 's return value is %d "  $g_ret  
  17.         varCntGlobeVar "12345678"  
  18.         printf "varCntGlobeVar's 's return value is %d "  $g_ret  
  19. }  
  20.   
  21. main  
  22. exit 0  

程序运行结果:
[plain] view plaincopy
  1. root@james-desktop:/home/workspace/mycode# ./testvar.sh   
  2. varCntGlobeVar's 's return value is 0 varCntGlobeVar's 's return value is 8  

 
通过这两个脚本运行的结果来看,这两个方法都是可以的,目前只想到这两种方法,各位要是还有其他的办法可以告诉我一下。
     Shell中的函数的参数都可以在shell函数中通过$0,$1.......一些相关的特殊变量得到,而不需要跟C语言中的函数一样通过值传递的方式给函数传递参数。相应的shell中函数的掉用也不同,直接通过函数名就可以,函数后面的圆括号都不要,然后要是有参数的话就直接在函数名后面加空格,然后输入参数就可以,如果是多个参数的话,中间要用空格分开。
还有一个比较重要的区别就是shell中的定义可以是在另一函数体内的,如上面的第一个例子中的那样。
          2shell中的与C语言中的条件判断不同。
之前我一直以为在shell中与在C语言中条件判断的就是使用的符号不同,shell中是中括号,C语言中是圆括号。但是这个中括号不是简单的中括号,下面就有我来简单的说一下:
这个左中括号(注意我说的是左中括号)"["LinuxUnix系统中的test命令的别名,test 及其别名通常都可以在 /usr/bin 或 /bin (取决于操作系统版本和供应商)中找到。
当您使用左方括号而非 test ,其后必须始终跟着一个空格、要评估的条件、一个空格和右方括号。右方括号不是任何东西的别名,而是表示所需评估参数的结束。条件两边的空格是必需的,这表示要调用 test,以区别于同样经常使用方括号的字符/模式匹配操作。
test 和 的语法如下:
test expression
[ expression ]
在这两种情况下,test 都评估一个表达式,然后返回真或假。如果它和 ifwhile 或 until 命令结合使用,则您可以对程序流进行广泛的控制。不过,您无需将 test 命令与任何其它结构一起使用;您可以从命令行直接运行它来检查几乎任何东西的状态。
因为它们彼此互为别名,所以使用 test 或 均需要一个表达式。表达式一般是文本、数字或文件和目录属性的比较,并且可以包含变量、常量和运算符。
           3shell中的switch/case语句与C语言中的区别。
这么写大家肯定要说我,因为在shell中就没有switch/case语句。不过case命令可类比C语言的switch/case语句,esac表示case语句块的结束。C语言的case只能匹配整型或字符型常量表达式,而Shell脚本的case可以匹配字符串和Wildcard,每个匹配分支可以有若干条命令,末尾必须以;;结束,执行时找到第一个匹配的分支并执行相应的命令,然后直接跳到esac之后,不需要像C语言一样用break跳出。大家看到我的第一个例子就是通过break语句直接跳出while循环。
好吧,先写到这里,以后想到啦再补充,如果有什么不足之处还请大家一定指出,一起学习一起提高哈。呵呵!加油!

没有评论:

发表评论