1、脚本如何接受参数-$序号代表相应的参数。
如kk me t ,其中kk未脚本名字,me ,t都是传递给脚本的参数,在脚本里面用$1代表me,$2就代表t。非常简单。留意一下$(10),$(11),即是10之后就需要用()括起来。
$ sh_program arg1 arg2 . . . argx//$0?$1 $2 .... $X
echo The value of command line argument \#1 is: $1
2、chmod +x的脚本直接键入脚本名字即可运行,它会产生一个新的shell进程来运行之。
3、shell使用“#”作为它的注释符。
4、# ???命令行参数的数量
* ???完全的参数字符串
就是$#, $*,举例kk me t,那么$#=2,$*='me t'其实不包含第0个参数,脚本名字就是第0参数。而$#,$*都不包括$0这个参数的。
5、shift [n]左移参数命令。n=1(默认)。就是把参数左移n位。看例子:
$kk me t //原始参数2个。
shift 1 //参数左移动
$kk t //最后参数变成1个。
参数列表堆栈中丢弃部分参数。
6、read [var1]...[varX] 从标准输入读取参数。类似于C的getchar功能。
7、脚本其他执行方法
sh shell_program argumetns?
shell_program 的属性可以不是可执行的。
shell_program 必须是可读的。
sh –x shell_program arguments每一行在被执行前被打印出来。
8、可以在你的shell程序的第一行前加入! /usr/bin/ shell_name来指定命令行解释器。
第二、分支
1、任何命令执行完成之后系统会返回一个值,而这个值用$?来检索。0为真,非0为假,其中1一般代表语法错误。
2、退出shell,返回值:exit [arg]
比如exit 2,然后使用$?检索这个值。就可以看到是2这个值。
3、功能强大的test命令。可以比较整数、字符串、文件。
有2种形式
test expression 或者 [expression]。注意:在"["和"]"符号的周围必须要有空格。
另外它的结果并不能直接看到,需要通过$?变量来检索。
a、比较整数
[ number relation number ]???
通过关系运算符来对数字进行比较关系运算符:
-lt ???小于
-le ???小于或者等于
-gt??? 大于
-ge ???大于或者等于
-eq ???等于
-ne ???不等于
注意:作为一个通用的规则,你应该在所有的$变量加上双引号来避免shell发生不正确的变量的替代。例如[ "$XX" -eq 3]中,如果XX为空而没有”“的就变成了[ -eq 3]这样会导致test命令语法错误。加上双引号之后就是["" -eq 3],这样保证test命令成功运行而得到正确的结果。
b、比较字符串
[ string1 = string2] 判断字符串是否相等
[ string1 !=string2] 判断字符串是否不等
-z string??????如果string的长度为0就为真
-n string??????如果string的长度为非零就为真
string ???????如果string的长度为非零就为真
c、比较文件
-r file????如果文件存在并且是可读的时候为真
-w file ??? 如果文件存在并且是可写的时候为真
-x file ??? 如果文件存在并且是可执行的时候为真
-d directory ?目录存在并且是个目录的时候为真
-f file 如果文件存在并且其字节数大于0,会返回真(0)
另外:test命令其他操作符语法:
-o ????OR
-a ????AND
\( ?\) ? GROUPING
看看例子:
$ [ "$ANS" = y -o "$ANS" = Y ]
$ [ "$NUM" -gt 10 -a "$NUM" -lt 20 ]
$ test -s file -a -r file -a -x file
4、if 语句,比较熟悉了,了解一下用法就可以了
a、形式1,简单流程控制 if ...then...fi
if ??[ $# -ne 3 ]
then??
echo Incorrect syntax??
echo Usage: cmd arg1 arg2 arg3??
exit 99
fi
b、形式2,if ... then ...else ...fi
看例子
if [ "$X" -lt 10 ]
then?echo X is less than 10
else?echo X is not less than 10
fi
留意一下就是if语句跟其他语言一样,是可以嵌套的。
5、多路分支结构case
case word in?
patterm1) list A???????
;;?
pattern2)?list B???????
;;?
patternN) list N???????
;;
esac
判断词为word,可能值为patternN),而word判断是基于严格的"字符串"判断
,另外很是搞笑的是每个分支shell使用两个分号作为结束符。对于patternN),可以使用几种适配符的,就是*,?,[...],|号,分别是任何字符,单一字符,括号中出现的字符,,or语句。
第三、循环
1、算术let expression or (( expression ))
$x=3
$y=5
$let x=x+2
$echo $x
5
$let "x=x/(Y+1)"
$echo $x
0.6(可能只能显示0)
$((y=y+3))
$echo $y
8
-----------------------
操作符?????描述
-????? ??减去
!????? ??逻辑相反
* / %????? 乘,除,余数
+ - ??????加,减
<= ?>= ?>?关系比较
== !=????? 等于不等于
=??????? 赋值
shell 可以接受上面这些参数。
注意双引号被用来忽略括号的特殊含义。同样如果你希望使用空格来分隔操作符和操作符的时候,就必须使用双引号,或者(( ))语句:let " x = x + (y / 2)" 或者(( x= x+ (y / 2) )),
其实从上面这个语句中可以看出,脚本语言一般来说对语法要求比较宽松,这样也直接决定了它需很多相应规则来协助它完成一些判断。松散语言一般功能肯定受限,比较vb跟c就清楚了,当然脚本不是严格意义上的语言。
2、while语句
$ cat test_while
X=1
while (( X <= 10 ))
do??
echo hello X is $X??
let X=X+1done
done
2个特点,1,使用do done来表示判断范围;2,循环变量需要手动让其增大。
3、unit语句
$ cat test_while
X=1
unit (( X > 10 ))
do??
echo hello X is $X??
let X=X+1done
done
阅读(1272) | 评论(1) | 转发(0) |