Linux shell编程.docx

上传人:asd****56 文档编号:70344002 上传时间:2023-01-19 格式:DOCX 页数:16 大小:55.35KB
返回 下载 相关 举报
Linux shell编程.docx_第1页
第1页 / 共16页
Linux shell编程.docx_第2页
第2页 / 共16页
点击查看更多>>
资源描述

《Linux shell编程.docx》由会员分享,可在线阅读,更多相关《Linux shell编程.docx(16页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、Linux Shell编程学习本地变量:用户自定义的变量。环境变量:用于所有用户变量,用于用户进程前,必须用export命令导出。位置变量:$0(脚本名),$1-$9:脚本参数。特定变量:脚本运行时的一些相关信息。$#传递到脚本的参数个数$*传递到脚本的参数,与位置变量不同,此选项参数可超过9个$脚本运行时当前进程的ID号,常用作临时变量的后缀,如haison.$!后台运行的(&)最后一个进程的ID号$与$#相同,使用时加引号,并在引号中返回参数个数$-上一个命令的最后一个参数$?最后命令的退出状态,0表示没有错误,其他任何值表明有错误#!/bin/sh#VarTest.sh#To test

2、the variablesUSER=haisonecho Hello,$USER,the output of this script are as follows:echo The script name is :basename $0echo The first param of the script is :$1echo The second param of the script is :$2echo The tenth param of the script is :$10echo All the params you input are :$*echo The number of t

3、he params you input are:$#echo The process ID for this script is :$echo The exit status of this script is :$?n文件状态测试-d目录-r可读-f常规文件-w可写-L符号连接-x可执行-s文件长度大于0,非空-u文件有suid位设置示例: -s haison.c 0表示成功,其他为失败,下同。逻辑操作符-a逻辑与(and),操作符两边均为真,结果为真,否则为假。-o逻辑或(or),操作符两边一边为真,结果为真,否则为假。! 逻辑否,条件为假,结果为真,反之。n示例: -r haison.c

4、 a w hai.c 字符串测试=两个字符串相等-z空串 !=两个字符串不相等-n非空串示例: -z $SHELL 数值测试-eq数值相等(equal to)-lt第一个数小于第二个数(less than)-ne数值不相等(not equal to)-le第一个数小于等于第二个数-gt第一个数大于第二个数(greater than)-ge第一个数大于等于第二个数示例: “10” -eq “12” If语句格式1If 条件then命令fi格式2if 条件 ;then命令fi 格式3if 条件then命令1else命令2fi格式4if 条件1then命令1elif 条件2 then命令2else命

5、令3fi示例#!/bin/sh#ifTest#to show the method of if echo -e Enter the first integer:cread FIRSTecho -n Enter the second integer:read SECONDif $FIRST -gt $SECOND then echo $FIRST is greater than $SECONDelif $FIRST -lt $SECOND then echo $FIRST is less than $SECOND elseecho $FIRST is equal to $SECOND fi程序测

6、试图:nFor 循环格式for 变量名in列表do命令done当变量值在列表里,for循环即执行一次所有命令,使用变量名访问列表中取值。嵌套循环可以将一个for循环嵌在另一个for循环里实例:#!/bin/sh#forTest#to test the method of forCOUNTER=0for FILES in *do COUNTER=expr $COUNTER + 1done echo There are $COUNTER files in pwd 程序运行截图函数所有函数在使用前必须定义,这意味着必须将函数放在脚本开始部分,直至shell解释器首次发现它,才可以使用。调用函数仅使用

7、其函数名即可,要传给函数的变量跟在函数后面。函数里面定义的变量以下划线(_)开始。函数可以放在同一个文件中作为一段代码,也可以放在只包含函数的单独文件中,文件也必须以#!/bin/sh开头。格式:函数名()命令实例:#!/bin/sh#funTest#to test the fucnctionDATE=dateHello()echo “Hello,today is $DATE”Hello程序运行截图赋值语句的引号不是单引号,而是反引号(Tab键上面的那个),建议用$()代替反引号,不然很容易将反引号误写为单引号shell使用引号(单引号/双引号)和反斜线()用于向shell解释器屏蔽一些特殊字

8、符. 反引号()对shell则有特殊意义. 如: abc=how are you (bash/pdksh) set abc = how are you (tcsh) 这个命令行把三个单词组成的字符串how are you作为一个整体赋值给变量abc. abc1=LOGNAME,how are you! (bash/pdksh) set abc1=$LOGNAME,how are you! (tcsh) abc2=$LOGNAME,how are you! (bash/pdksh) set abc2=$LOGNAME,how are you! (tcsh) LOGNAME变量是保存当前用户名的s

9、hell变量,假设他的当前值是:wang.执行完两条命令后, abc1的内容是:$LOGNAME, how are you!.而abc2的内容是;wang, how are you!. 象单引号一样,反斜线也能屏蔽所有特殊字符.但是他一次只能屏蔽一个字符.而不能屏蔽 一组字符. 反引号的功能不同于以上的三种符号.他不具有屏蔽特殊字符的功能.但是可以通过他将 一个命令的运行结果传递给另外一个命令. 如: contents=ls (bash/pdksh) set contents = ls (tcsh)退出和退出状态码exit 被用来结束一个脚本, 就像在C语言中一样. 它也返回一个值, 并且这个

10、值会传递给脚本的父进程, 父进程会使用这个值做下一步的处理.每个命令都会返回一个 退出状态码 (有时候也被称为 返回状态 ). 成功的命令返回0, 而不成功的命令返回非零值, 非零值通常都被解释成一个错误码. 行为良好的UNIX命令, 程序, 和工具都会返回0作为退出码来表示成功, 虽然偶尔也会有例外.同样的, 脚本中的函数和脚本本身也会返回退出状态码. 在脚本或者是脚本函数中执行的最后的命令决定退出状态码. 在脚本中, exit nnn命令将会把 nnn退出码传递给shell( nnn必须是十进制数, 范围必须是0 - 255)$?保存了最后所执行的命令的退出状态码. 当函数返回之后, $?

11、保存函数中最后所执行的命令的退出状态码. 这就是bash对函数返回值的处理方法. 当一个脚本退出, $?保存了脚本的退出状态码, 这个退出状态码也就是脚本中最后一个执行命令的退出状态码. 一般情况下, 0表示成功, 在范围1 - 255的整数表示错误.#!/bin/bash23 echo hello4 echo $? # 退出状态为0, 因为命令执行成功.56 lskdf # 无效命令.7 echo $? # 非零的退出状态, 因为命令执行失败.89 echo1011 exit 113 # 返回113退出状态给shell.12 # 为了验证这个结果, 可以在脚本结束的地方使用echo $?.1

12、314 # 一般的, exit 0 表示成功,15 #+ 而一个非零的退出码表示一个错误, 或者是反常的条件.文件测试操作符如果下面的条件成立将会返回真.-e 文件存在-a文件存在这个选项的效果与-e相同. 但是它已经被弃用了, 并且不鼓励使用.-f表示这个文件是一个一般文件(并不是目录或者设备文件)-s文件大小不为零-d表示这是一个目录-b表示这是一个块设备(软盘, 光驱, 等等.)-c表示这是一个字符设备(键盘, modem, 声卡, 等等.)-p这个文件是一个管道-h这是一个符号链接-L这是一个符号链接-S表示这是一个socket-t文件(描述符)被关联到一个终端设备上这个测试选项一般被

13、用来检测脚本中的stdin( -t 0 ) 或者stdout( -t 1 )是否来自于一个终端.-r文件是否具有可读权限(指的是正在运行这个测试命令的用户是否具有读权限)-w文件是否具有可写权限(指的是正在运行这个测试命令的用户是否具有写权限)-x文件是否具有可执行权限(指的是正在运行这个测试命令的用户是否具有可执行权限)-gset-group-id(sgid)标记被设置到文件或目录上如果目录具有sgid标记的话, 那么在这个目录下所创建的文件将属于拥有这个目录的用户组, 而不必是创建这个文件的用户组. 这个特性对于在一个工作组中共享目录非常有用.-uset-user-id (suid)标记被

14、设置到文件上如果一个root用户所拥有的二进制可执行文件设置了set-user-id标记位的话, 那么普通用户也会以root权限来运行这个文件. 1 这对于需要访问系统硬件的执行程序(比如pppd和cdrecord)非常有用. 如果没有suid标志的话, 这些二进制执行程序是不能够被非root用户调用的.-rwsr-xr-t 1 root 178236 Oct 2 2000/usr/sbin/pppd对于设置了suid标志的文件, 在它的权限列中将会以s表示.-k设置粘贴位对于粘贴位的一般了解, save-text-mode标志是一个文件权限的特殊类型. 如果文件设置了这个标志, 那么这个文件

15、将会被保存到缓存中, 这样可以提高访问速度. 2 粘贴位如果设置在目录中, 那么它将限制写权限. 对于设置了粘贴位的文件或目录, 在它们的权限标记列中将会显示t.drwxrwxrwt 7 root 1024 May 19 21:26 tmp/如果用户并不拥有这个设置了粘贴位的目录, 但是他在这个目录下具有写权限, 那么这个用户只能在这个目录下删除自己所拥有的文件. 这将有效的防止用户在一个公共目录中不慎覆盖或者删除别人的文件. 比如说/tmp目录. (当然, 目录的所有者或者root用户可以随意删除或重命名其中的文件.)-O判断你是否是文件的拥有者-G文件的group-id是否与你的相同-N从

16、文件上一次被读取到现在为止, 文件是否被修改过f1 -nt f2文件f1比文件f2新f1 -ot f2文件f1比文件f2旧f1 -ef f2文件f1和文件f2是相同文件的硬链接!非 - 反转上边所有测试的结果(如果没给出条件, 那么返回真).整数比较-eq等于if $a -eq $b -ne不等于if $a -ne $b -gt大于if $a -gt $b -ge大于等于if $a -ge $b -lt小于if $a -lt $b -le小于等于if $a -le $b 小于(在双括号中使用)($a $b)=小于等于(在双括号中使用)($a 大于(在双括号中使用)($a $b)=大于等于(在双

17、括号中使用)($a = $b)字符串比较=等于if $a = $b =等于if $a = $b 与=等价.=比较操作符在双中括号对和单中括号对中的行为是不同的.1 $a = z* # 如果$a以z开头(模式匹配)那么结果将为真2 $a = z* # 如果$a与z*相等(就是字面意思完全一样), 那么结果为真.34 $a = z* # 文件扩展匹配(file globbing)和单词分割有效.5 $a = z* # 如果$a与z*相等(就是字面意思完全一样), 那么结果为真.67 # 感谢, Stephane Chazelas!=不等号if $a != $b 这个操作符将在 . 结构中使用模式匹

18、配.小于, 按照ASCII字符进行排序if $a $b if $a $b 注意大于, 按照ASCII字符进行排序if $a $b if $a $b 注意使用在 结构中的时候需要被转义.参考例子 26-11, 这个例子展示了如何使用这个比较操作符.-z字符串为null, 意思就是字符串长度为零-n字符串不为null.当-n使用在中括号中进行条件测试的时候, 必须要把字符串用双引号引用起来. 如果采用了未引用的字符串来使用! -z, 甚至是在条件测试中括号(参见例子 7-6)中只使用未引用的字符串的话, 一般也是可以工作的, 然而,这是一种不安全的习惯. 习惯于使用引用的测试字符串才是正路. 1例

19、子 7-5. 算术比较与字符串比较1 #!/bin/bash23 a=44 b=56 # 这里的a和b既可以被认为是整型也可被认为是字符串.7 # 这里在算术比较与字符串比较之间是容易让人产生混淆,8 #+ 因为Bash变量并不是强类型的.10 # Bash允许对于变量进行整形操作与比较操作.11 #+ 但前提是变量中只能包含数字字符.12 # 不管怎么样, 还是要小心.14 echo16 if $a -ne $b 17 then18 echo $a is not equal to $b19 echo (arithmetic comparison)20 fi22 echo24 if $a !=

20、 $b 25 then26 echo $a is not equal to $b.27 echo (string comparison)28 # 4 != 529 # ASCII 52 != ASCII 5330 fi32 # 在这个特定的例子中, -ne和!=都可以.34 echo36 exit 0-a逻辑与exp1 -a exp2 如果表达式exp1和exp2都为真的话, 那么结果为真.-o逻辑或exp1 -o exp2 如果表达式exp1和exp2中至少有一个为真的话, 那么结果为真.这与Bash中的比较操作符&和|非常相像, 但是这个两个操作符是用在双中括号结构中的.1 condition1 & condition2 -o和-a操作符一般都是和test命令或者是单中括号结构一起使用的.1 if $exp1 -a $exp2

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 其他杂项

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁