最近由于工作的关系,粗略的接触到一点脚本,之前也接触过,只是之前没有写过,只是偶尔自己加几句话怎么的。今天自己动手写啦一下,把shell对比于C语言的一些不同写在这里,当作自己学习的一个笔记,如果有不足之处还望各位牛人指出。
不说这么多的废话吧,还是直接上代码:
- #!/bin/sh
- start_command()
- {
- echo "the first argument is :" $1
- do_it()
- {
- local rc=0
- echo "I just test !"
- echo "Input Error !"
- }
- while [ 1 ] ; do
- read finished
- case $finished in
- 1) echo "your input is 1 !" ;;
- 2) echo "your input is 2 !" ;;
- q) echo "quit successful !"
- break ;;
- *) do_it ;;
- esac
- done
- }
- start_command "hello world !"
- exit 0
程序运行的结果:
- the first argument is : hello world !
- 1
- your input is 1 !
- 2
- your input is 2 !
- 3
- I just test !
- Input Error !
- 2
- your input is 2 !
- 1
- your input is 1 !
- q
- quit successful !
由于自己没有系统的看过shell语法的书,在这里只是简单的把shell的语法类比于C语言的来学习。通过这上面一个简单的例子,我主要归纳出啦下面3点得不同。
1,shell中函数的定义与函数的调用。
在shell中,函数的定义不需要像在C语言中那样要指明函数的返回值类型,函数的参数个数以及每个参数的类型。
写到这里大家首先会想到难道shell中的函数都没有返回值么?不是,shell中的函数可以有返回值的,下面我通过自己总结的两个方法来讲解:1)echo法,2)全局变量法。
1)echo法
在被调用函数中需要返回的值,使用echo将其显示至stdout,然后在调用的地方再使用`func var1`获得stdout中的值,获得值可以直接赋值给变量。例如:
- #!/bin/bash
- # echo法,返回一个字符串的长度
- varCnt()
- {
- var=$1
- ret=0
- if [ "$var" != "" ] ; then
- ret=${#var}
- fi
- echo $ret
- }
- main()
- {
- printf "varCnt's 's return value is %s " `varCnt ""`
- printf "varCnt's 's return value is %s " `varCnt "12345678"`
- }
- main
- exit 0
程序运行结果:
- root@james-desktop:/home/workspace/mycode# ./testecho.sh
- varCntGlobeVar's 's return value is 0 varCntGlobeVar's 's return value is 8
2)全局变量法
这个比较简单,声明一个全局变量 declare -i g_ret ,在function的返回值存储在全局变量中。调用处在函数执行完后,使用就可以了。例如:
- #!/bin/bash
- # 全局变量法,返回一个字符串的长度
- varCntGlobeVar()
- {
- var=$1
- if [ "$var" != "" ] ; then
- g_ret=${#var}
- fi
- }
- main()
- {
- declare -i g_ret=0
- varCntGlobeVar ""
- printf "varCntGlobeVar's 's return value is %d " $g_ret
- varCntGlobeVar "12345678"
- printf "varCntGlobeVar's 's return value is %d " $g_ret
- }
- main
- exit 0
程序运行结果:
- root@james-desktop:/home/workspace/mycode# ./testvar.sh
- varCntGlobeVar's 's return value is 0 varCntGlobeVar's 's return value is 8
通过这两个脚本运行的结果来看,这两个方法都是可以的,目前只想到这两种方法,各位要是还有其他的办法可以告诉我一下。
Shell中的函数的参数都可以在shell函数中通过$0,$1.......一些相关的特殊变量得到,而不需要跟C语言中的函数一样通过值传递的方式给函数传递参数。相应的shell中函数的掉用也不同,直接通过函数名就可以,函数后面的圆括号都不要,然后要是有参数的话就直接在函数名后面加空格,然后输入参数就可以,如果是多个参数的话,中间要用空格分开。
还有一个比较重要的区别就是shell中的定义可以是在另一函数体内的,如上面的第一个例子中的那样。
2,shell中的与C语言中的条件判断不同。
之前我一直以为在shell中与在C语言中条件判断的就是使用的符号不同,shell中是中括号,C语言中是圆括号。但是这个中括号不是简单的中括号,下面就有我来简单的说一下:
这个左中括号(注意我说的是左中括号)"["是Linux和Unix系统中的test命令的别名,test 及其别名通常都可以在 /usr/bin 或 /bin (取决于操作系统版本和供应商)中找到。
当您使用左方括号而非 test 时,其后必须始终跟着一个空格、要评估的条件、一个空格和右方括号。右方括号不是任何东西的别名,而是表示所需评估参数的结束。条件两边的空格是必需的,这表示要调用 test,以区别于同样经常使用方括号的字符/模式匹配操作。
test 和 [ 的语法如下:
test expression
[ expression ]
在这两种情况下,test 都评估一个表达式,然后返回真或假。如果它和 if、while 或 until 命令结合使用,则您可以对程序流进行广泛的控制。不过,您无需将 test 命令与任何其它结构一起使用;您可以从命令行直接运行它来检查几乎任何东西的状态。
因为它们彼此互为别名,所以使用 test 或 [ 均需要一个表达式。表达式一般是文本、数字或文件和目录属性的比较,并且可以包含变量、常量和运算符。
3,shell中的switch/case语句与C语言中的区别。
这么写大家肯定要说我,因为在shell中就没有switch/case语句。不过case命令可类比C语言的switch/case语句,esac表示case语句块的结束。C语言的case只能匹配整型或字符型常量表达式,而Shell脚本的case可以匹配字符串和Wildcard,每个匹配分支可以有若干条命令,末尾必须以;;结束,执行时找到第一个匹配的分支并执行相应的命令,然后直接跳到esac之后,不需要像C语言一样用break跳出。大家看到我的第一个例子就是通过break语句直接跳出while循环。
好吧,先写到这里,以后想到啦再补充,如果有什么不足之处还请大家一定指出,一起学习一起提高哈。呵呵!加油!
没有评论:
发表评论