linux开发(一) shell编程要点

linux开发(一) shell简单编程


1、变量赋值时,不需要加$符,只有取变量值的时候,需要加$符

2、双引号可以进行变量值替换,单引号和\不能进行变量替换

3、主要的环境变量(常量):$HOME 当前用户的家目录;$PATH 以冒号分隔的用来搜索命令的目录列表;$PS1 命令提示符,通常是$字符,但在bash中,你可以使用一些更复杂的值,例如字符串[\u@\h \W]\$,它给出用户名、机器名和当前目录名;$PS2 二级提示符,用来表示后续的输入,通常是>字符;$IFS  输入域分隔符,当shell读取输入时,它给出用来分隔单词的一组字符,它们通常是空格、制表符和换行符;$0 shell脚本的名字;$# 传递给脚本的参数个数;$$ shell脚本的进程号,脚本程序通常会用它来生成一个唯一的临时文件,如/tmp/tmpfile_$$

4、$1,$2...根据位置取脚本的输入参数,最多到$9,下文同;$*在一个变量中列出所有的参数,各个参数之间用环境变量IFS中的第一个字符分隔,如果IFS被修改了,那么$*将命令行分隔为参数的方式随之改变;$@它是$*的变体,它不使用IFS环境变量,所有即使IFS为空,参数也不会挤在一起

5、测试命令:test或[符号,使用后者时,为了便于阅读,通常加一个]进行匹配,[ statement ]和内部的语句必须用空格分开。测试分三类:(1)字符串:str1=str2,str1!=str2,-n str不为空则真,-z str为null则真;(2)算术:-eq,-ne,-gt,-ge,-lt,-le,!(表达式为假则结果为真);(3)文件:-d,文件是目录则真,-e,如果文件存在则真(不可移植,建议使用-f),-f,文件是普通文件则真,-g,如果文件的set-group-id位被设置则真,-r,文件可读则真,-s,文件大小不为0则真,-u,文件的set-user-id位被设置则真,-w,文件可写则真,-x,文件可执行则真。

8、if语句:if condition;then statement;else statment;fi
9、elif语句:if condition;then statement;elif condition;then statement;else statment;fi
10、for语句:for variable in values;do statement;done 循环直到values遍历完
11、while语句:while condition;do statement;done 循环直到condition为假
12、util语句:util condition;do statement;done 循环直到condition为真
13、case语句:case variable in pattern[!pattern]...) statement;;pattern[!pattern]...) statement;;...esac
14、条件测试时,如果条件是字符串,最好用"$var",即双引号把变量括起来,这样可以防止变量为空字符串时的错误
15、AND列表(&&):statement1&&statement2&&statement3&&...,只有前面的语句执行结果为真时,才执行后面的语句,如果某个语句返回假,则整个语句返回假
16、OR列表(||):statement1||statement2||statement3||...,只有前面的语句执行结果为假时,才执行后面的语句,如果某个语句返回真,则整个语句返回真,该语句后面的语句将不会执行,
17、{}语句块:可以在只允许单条语句的地方放入多条语句
18、函数:func_name(){statement} 函数被调用前必须先定义,所以最好把所有的函数定义放在脚本的开始,也就是任何一个调用之前
19、local关键字:在函数内部定义变量,变量作用范围限于函数内部,如果外部变量(全局变量)和局部变量同名,则局部变量会覆盖全局变量的值。在函数名后空格分隔的变量或字符串作为函数参数,在函数内部用$1,$2...位置参数来引用参数
20、break命令:可以跳出循环,提供数值时表明跳出几层循环,默认一层
21、:命令:是一个空命令,相当于true的别名,运行速度比true快,但是可读性差
22、continue命令:使循环跳到下一次循环
23、.命令:在命令行下,在当前shell中执行命令(或另一个命令)。一般情况下,在脚本内执行外部命令或其他脚本程序时,它会创建一个新的子shell,外部命令和其他脚本在该shell中执行,执行完后返回结果并丢弃子shell,所以无法使用当前shell的环境变量也不能保持子shell的环境变量。这时候用.命令执行外面命令或脚本,则不会创建子shell,而是在当前shell执行。类似于把外部命令和其他脚本包含到了本环境中
24、eval命令:对参数进行求值
25、exec命令:典型用法是替换当前shell为一个不同的程序,替换后该命令后面的语句不再执行,因为当前shell已经不存在
26、exit命令:0成功,1-125用户自定义错误码,126文件不可执行,127命令未找到,128及以上出现一个信号
27、export命令:导出当前的变量,作为子shell的环境变量,在子shell中可以直接使用,而且可以被后续依次调用的所有shell使用
28、expr命令:把他的参数当做表达式求值,主要用于数值计算。使用方法`expr statement`(反引号)或$(expr statement)。可以执行加减乘除比较或与等运算
29、printf命令:和C语言的printf类似,只是不支持浮点数输出
30、return命令:用作函数返回,如果没有数值参数作为返回值,则返回最后一条命令的退出码
31、set命令:为shell设置参数变量,可以用来保存函数或命令的返回值,尤其返回值是空格分隔的多个值时很有效,可以用$1,$2...按位置取set的参数
32、shift命令:把所有参数变量左移一位,$0不变,$2变为$1,$1被丢弃,如果指定一个数值,则表示左移N次,结果会影响$* $@ $#的值(因为有参数被丢弃)。当参数超过9个时,可以用它来丢弃前面的参数,然后访问第十个及以后的参数
33、trap命令:在接收到信号时要做的处理,格式:trap command signal,第一个参数处理方法,第二个参数是信号名称(没有SIG前缀)。忽略某个信号,只需要把command设置为空字符串'',恢复默认处理,只需要把command设置为-
34、unset命令:从环境中删除变量或函数,不能删除只读变量(如环境变量)。删除和置为空不同,删除后变量不再存在,置为空变量仍存在
35、$、$()、$(())的区别:$expression是取变量的值,$(expression)是执行命令expr并返回输出结果(不是退出状态\退出码),$((expression))计算expr表达式的值,主要用于数值计算,用于替代expr命令,后者计算时需要启动子shell,效率很低
36、xargs把命令的标准输出转化为一组参数,可以用位置访问
37、${var}:参数替换,注意这里是大括号,不是小括号(小括号的用法见上面35)。常见替换规则:${param:-default},如果param为空,则使用default的值,${#param},给出param的长度,${param%word},从param的尾部开始删除与word匹配的最小部分,返回删除后剩余部分,${parma%%word},删除最长部分,返回剩余部分,${parma#word},从头部开始删除最小部分,${param##word},删除最长部分
38、${foo:=bar}:如果foo不为空则返回foo,否则把bar赋值给foo并返回该值;${foo:?bar}:在foo不存在或为空时输出foo:bar并异常终止程序;${foo:+bar}:foo存在且不为空时返回bar






猜你喜欢

转载自blog.csdn.net/blwinner/article/details/56286145