网站地址栏,云南省建设厅标准员网站,设计网站有哪些,网站改版 更换服务器 排名丢失linux脚本(shell)编程 啊#xff0c;昨天上网看到一篇讲 linux/unix shell 的文章#xff0c;想想自己最后写这东西也是一年前的事了#xff0c;想想都快忘光了。 还是整理一下#xff0c;做一次回顾#xff0c;以后说不定还用得上#xff1b;帖出来#xff0c;方便第一…linux脚本(shell)编程 啊昨天上网看到一篇讲 linux/unix shell 的文章想想自己最后写这东西也是一年前的事了想想都快忘光了。 还是整理一下做一次回顾以后说不定还用得上帖出来方便第一次学习这东西的同道中人。 如果发现有错误的地方请指出留一句即可我会感激的。废话少说了 linux 下最重要的脚本语言算是 bash 了我也就写点这个吧(我也只会这个:))。跟其他开发语言如C比bash 是比较简单的一种语言主要用于写一些脚本代码一些批处理或安装程序。你可以看看在/etc/init.d/目录下那里就有很多用来控制各个服务的脚 本文件。 先看一个“hello world!”的例子 在某个目录下新建一个文件叫hello.sh敲入以下代码 #!/bin/shecho hello world! 好就这些。保存在命令提示符下进入保存“hello.sh”的目录这样执行 #sh hello.sh回车 看到了吧哈哈不过你高兴的不要太早了只并不能说明什么就象你在其他编程环境中做的“hello world.”一样离高手的距离还远着呢。 我们先看看bash脚本中变量的使用。 修改上面的“hello world!”的例子改成下面的样子 #!/bin/bash# This is a very simple examplestrhello world!echo $str 保存后按照上面的方法执行该脚本你将看到和以前一样的效果。我们看看每一句的意义 第 一行#! 是说明 hello.sh 这个文件的类型的有点类似 Windows 系统下用文件后缀来表示不同文件类型的意思。Linux 系统根据 #! 及该字串后面的信息确定该文件的类型。在 BASH 中 第一行的 #! 及后面的 /bin/bash 就表明该文件是一个 BASH 程序需要由 /bin 目录下的 bash 程序来解释执行。BASH 这个程序一般是存放在 /bin 目录下。这一行的写法是固定的。 第二行的 # This is a ... 就是 BASH 程序的注释在 BASH 程序中从“#”号没有“!”号开始到行尾的部分均被看作是程序的注释相当于C/C语言中的“//”。 第三行是为一个名称为 str 的变量赋值。 第四行的 echo 语句的功能是把 echo 后面的字符串或变量的内容输出到标准输出中去。需要注意的是 BASH 中的绝大多数语句结尾处都没有分号。 对 于第三行可能有人会问在C/C中变量都属于某个类型在这变量 str 的类型是什么呢在 BASH 中变量定义是不需要的没有 int i 这样的定义过程。如果想用一个变量只要他没有在前面被定义过就直接可以用当然你使用该变量的第一条语句应该是对他赋初值了如果你不赋初值也没关 系只不过该变量是空 注意是 NULL不是 0 。 关于变量的使用要注意以下几点 一变量赋值时“”左右两边都不能有空格 二BASH 中的语句结尾不需要分号; 三除了在变量赋值和在FOR循环语句头中BASH 中的变量使用必须在变量前加$符号。 在比较详细的 bash 文档中会规定使用变量要采用这样的形式${STR}如果你的脚本出了莫名其妙的错误不妨看看是不是这个问题造成的。 BASH 中的变量既然不需要定义也就没有类型一说那是不是一个变量既可以存放整数也可以存放字符串呢对 一个变量即可以被定义为一个字符串也可以被再定义为整数。如果对该变量进行整数运算他就被解释为整数如果对他进行字符串操作他就被看作为一个字符串。请看下面的例子 #!/bin/bashx2006let x $x 1echo $xxa string.echo $x 执行一下看看 又 出现了新的关键字let。关于整数变量计算有如下几种 - * / % 他们的意思和字面意思相同在*和/之前必须冠以反斜线已防被SHELL先行解释。整数运算一般通过 let 和 expr 这两个指令来实现如对变量 x 加 1 可以写作let x $x 1 或者 xexpr $x 1 关于运行时参数我们在执行脚本时有时很想传个参数进去如#sh mysh.sh hdz(回车)好很简单在 bash 中使用这样传进来的变量时也要在前面加“$”符号。 $# 传入脚本的命令行参数个数 $* 所有命令行参数值在各个参数值之间留有空格 位置变元 $0 命令本身shell文件名 $1 第一个命令行参数 $2 第二个命令行参数 ... 好编辑以下脚本#!/bin/sh echo number of vars:$# echo values of vars:$* echo value of var1:$1echo value of var2:$2echo value of var3:$3echo value of var4:$4 保存文件名为 my.sh执行时传入参数#sh my.sh a b c d e(回车)看到结果你就会更清楚各个变量的意思。如果访问的参数在执行时没有传入如有一条这样的代码 echo value of var4:$100 而在执行时并没有输入100个参数那取得的值为 NULL。 在 BASH 程序中如果一个变量被使用了那么直到该程序的结尾该变量都一直有效。为了使得某个变量存在于一个局部程序块中就引入了局部变量的概念。BASH 中在变量首次被赋初值时加上 local 关键字就可以声明一个局部变量如下面这个例子 #!/bin/bashHELLOvar1echo $HELLOfunction hello { local HELLOvar2 echo $HELLO} echo $HELLO 该程序的执行结果是 var1var2var1 这个执行结果表明全局变量 $HELLO 的值在执行函数 hello 时并没有被改变。也就是说局部变量 $HELLO 的影响只存在于函数那个程序块中。 BASH 中的变量与 C 语言中变量的区别 这里我们为原来不熟悉 BASH 编程但是非常熟悉 C 语言的程序员总结一下在 BASH 环境中使用变量需要注意的问题。 1BASH 中的变量在引用时都需要在变量前加上 $ 符号 第一次赋值及在For循环的头部不用加 $符号 2BASH 中没有浮点运算因此也就没有浮点类型的变量可用 3BASH 中的整形变量的比较符号与 C 语言中完全不同而且整形变量的算术运算也需要经过 let 或 expr 语句来处理 下面我们来看看变量之间的比较操作 在比较操作上整数变量和字符串变量各不相同详见下表 对应的操作 整数操作 字符串操作相同 -eq 不同 -ne !大于 -gt 小于 -lt 大于或等于 -ge小于或等于 -le为空 -z不为空 -n 比如 比较整数 a 和 b 是否相等就写做 if [ $a $b ] 判断整数 a 是否大于整数 b 就写做 if [ $a -gt $b ] 比较字符串 a 和 b 是否相等就写作if [ $a $b ] 判断字符串 a 是否为空就写作 if [ -z $a ] 判断整数变量 a 是否大于 b 就写作if [ $a -gt $b ] 注意在“[”和“]”符号的左右都留有空格。 BASH 是 Linux 操作系统的 Shell因此系统的文件必然是 BASH 需要操作的重要对象运算符下面说说对文件的操作 含义 满足下面要求时返回 TRUE -e 文件已经存在-f 文件是普通文件-s 文件大小不为零-d 文件是一个目录-r 文件对当前用户可以读取-w 文件对当前用户可以写入-x 文件对当前用户可以执行-g 文件的 GID 标志被设置-u 文件的 UID 标志被设置-O 文件是属于当前用户的-G 文件的组 ID 和当前用户相同file1 -nt file2 文件 file1 比 file2 更新file1 -ot file2 文件 file1 比 file2 更老 如 if [ -x /root ] 可以用于判断 /root 目录是否可以被当前用户进入。 上面有进行比较的 if 关键字是的bash 中有和 C 语言相似的流程控制语句主要有if、for、while、until、case 等语句。下面较详细的介绍一下。 if 语句用于判断和分支其语法规则和 C 语言的 if 非常相似。其几种基本结构为 if [ expression ]then #code blockfi 或者 if [ expression ]then #code blockelse #code blockfi 或者 if [ expression ]then #code blockelse if [ expression ] then #code block else #code blockfi 或者 if [ expression ]then #code blockelif [ expression ] then #code block else #code blockfi 如 果您为了简洁想把 then 和 if 放在一行那就要这样写了if [ expression ]; then。即在 then 前加一个“;”号bash 里面每行的结束处没有分号那要把两行的内容写到一行是不是要用“;”号隔开啊哈哈对这样说来“if [ expression ]; then”只是把两行内容写到了一行没有什么新的东西。。 for 循环结构与 C 语言中有所不同在 BASH 中 for 循环的基本结构是 for $var in [list]do #code blockdone 其 中 $var 是循环控制变量[list] 是 var 需要遍历的一个集合do/done 对包含了循环体相当于 C 语言中的一对大括号。另外如果do 和 for 被写在同一行必须在 do 前面加上 ;。如 for $var in [list]; do 。下面是一个运用 for 进行循环的例子 #!/bin/bash for day in Sun Mon Tue Wed Thu Fri Satdo echo $daydone # 如果列表被包含在一对双引号中则被认为是一个元素for day in Sun Mon Tue Wed Thu Fri Satdo echo $daydone exit 0 注意上面的例子中在 for 所在那行的变量 day 是没有加 $ 符号的而在循环体内echo 所在行变量 $day 是必须加上 $ 符号的。另外如果写成 for day 而没有后面的 in [list] 部分则 day 将取遍命令行的所有参数。如这个程序 #!/bin/bash for paramdo echo $paramdone exit 0 上面这个程序将列出所有命令行参数。for 循环结构的循环体被包含在 do/done 对中这也是后面的 while、until 循环所具有的特点。 while 循环的基本结构是 while [ condition ]do #code blockdone 这个结构请大家自己编写一个例子来验证。 until 循环的基本结构是 until [ condition is TRUE ]do #code blockdone 这个结构也请大家自己编写一个例子来验证。 caseBASH 中的 case 结构与 C 语言中的 switch 语句的功能比较类似可以用于进行多项分支控制。其基本结构是 case $var in condition1 ) ;; condition2 ) ;; * ) default statments;;esac 下面这个程序是运用 case 结构进行分支执行的例子 #!/bin/bash echo Hit a key, then hit return.read Keypress case $Keypress in [a-z] ) echo Lowercase letter;; [A-Z] ) echo Uppercase letter;; [0-9] ) echo Digit;; * ) echo Punctuation, whitespace, or other;;esac exit 0 上面例子中的第四行 read Keypress 一句中的 read 语句表示从键盘上读取输入。这个命令将在本讲义的 BASH 的其他高级问题中讲解。 break/continue 熟悉 C 语言编程的都很熟悉 break 语句和 continue 语句。BASH 中同样有这两条语句而且作用和用法也和 C 语言中相同break 语句可以让程序流程从当前循环体中完全跳出而 continue 语句可以跳过当次循环的剩余部分并直接进入下一次循环。 关于bash在控制台下的快捷键 ctrlu 删除光标以前的所有字符ctrld 删除光标以前的一个字符ctrlk 删除光标以后的所有字符ctrlh 删除光标以后的一个字符ctrlt 调换光标前两个字符的次序ctrla 移动光标到最前面ctrle 移动光标到最后面ctrlp 上一个命令ctrln 下一个命令ctrls 锁定输入ctrlq 解除锁定ctrlf 移动光标到后一个字符ctrlb 移动光标到前一个字符ctrlx 标记一个位置ctrlc 清除当前的输入 原文链接 http://blog.csdn.net/compiler_hdz/article/details/575113转载于:https://www.cnblogs.com/hdu-2010/p/4536429.html