
Bash编程示例一
通过学习如何使用bash脚本语言进行编程,这将使Linux的日常交互变得更加有趣和富有成效,同时还利用已经熟悉和喜爱的标准UNIX概念(例如管道和重定向).
Bash编程示例
第一部分
在bash中定义环境变量的标准方法是:
$ myvar ='这是我的环境变量!'
上面的命令定义了一个名为“ myvar”的环境变量,并包含字符串“ This is my environmentvariable!”. 上面有几点要注意: 首先,等号“ =”的两侧没有空格. 任何空格都会导致错误. 要注意的第二件事是,尽管在定义单词时可以省略引号,但是当所定义的环境变量的值大于一个单词(包括空格或制表符)时,必须使用引号. 第三,尽管通常可以使用双引号而不是单引号,但是在上面的示例中,这样做会导致错误. 因为使用单引号会禁用bash功能,即扩展功能,所以特殊字符和字符系列将被值替换. 例如,“!”字符是历史扩展字符,bash通常用之前输入的命令替换它. 尽管此类似于宏的函数很方便,但我们现在只想在环境变量之后添加一个简单的感叹号,而不是宏.
另一个例子
$ echo foo $ myvarbar
对于是否扩展$ m,$ my,$ myvar,$ myvarbar ...,Bash会感到困惑. 在这种情况下,请将其括在大括号内.
$ echo foo $ {myvar} bar
请务必记住: 如果环境变量没有通过空格(空格或制表符)与周围的文本隔开,请使用更清晰的花括号.
导出环境变量时,以后运行的任何脚本或可执行程序环境都可以自动使用它. Shell脚本可以使用Shell的内置环境变量来支持“到达”环境变量,而C程序可以使用getenv()函数来调用. 以下C代码示例:
#include
#include
int主(无效){
char * myenvvar = getenv(“ myvar”);
printf(“ myvar环境变量是%s”,myenvvar);
}
直接执行程序,结果是:
myvar环境变量为(null)
导出myvar后,程序执行结果为:
myvar环境变量是这是我的环境变量!
使用unset删除环境变量后,程序执行结果为:
myvar环境变量为(null)
此外,环境变量可以在一行上任何地方定义,例如:
export myvar = abc
截断的字符串概述
截断字符串是将初始字符串截断为较小的独立块. 这是普通shell脚本每天执行的任务之一.
$ basename /usr/local/share/doc/foo/foo.txt
foo.txt
基本名是截断字符串的非常方便的工具. 其相关的命令dirname返回由basename丢弃的“其他”部分路径.
$ dirname /usr/local/share/doc/foo/foo.txt
/ usr / local / share / doc / foo
如何通过以下方法来完成如何创建包含可执行命令结果的环境变量的命令替换:
$ MYDIR =`dirname / usr / local / share / doc / foo / foo.txt`
$ echo $ MYDIR
/ usr / local / share / doc / foo
上面的程序需要注意: 第一行,要执行的命令放在反引号中. 不是标准的单引号,而是键盘上通常在Tab键上方的单引号. (注意: 将强制显示单引号中的内容,这意味着将不替换单引号中的命令)
除了反引号外,还可以使用$()完成相同的操作
$ MYDIR = $(目录名/usr/local/share/doc/foo/foo.txt)
$ echo $ MYDIR
/ usr / local / share / doc / foo
使用命令替换将任何命令或命令管道放在``或$()之间,并将其分配给环境变量.
像人员一样截断字符串
有时我们需要执行更高级的字符串“截断”,如以下示例:
$ MYVAR = foodforthought.jpg
$ echo $ {MYVAR ## * fo}
rthought.jpg
$ echo $ {MYVAR#* fo}
odforthought.jpg
第一个回声bash获取MYVAR,找到最长子串,该子串从字符串“ foodforthought.jpg”的开头开始,与通配符“ * fo”匹配,然后从字符串的开头将其截断.
第二个回声bash使用MYVAR,找到最短的子字符串,该子字符串从字符串“ foodforthought.jpg”的开头开始,与通配符“ * fo”匹配,然后从字符串的开头将其截断.
内存方法: 搜索最长匹配项时,请使用##(因为##比#长). 搜索最短的匹配项时,请使用#. 如何记住使用“#”字符从字符串开头退出?在美国键盘上,shift-4是“ $”,它是bash变量扩展字符. 在键盘上,“ $”的左侧紧邻是“#”. 这样,您可以看到: “#”位于“ $”的“开始”位置,因此(根据我们的存储方法),“#”从字符串的开头删除字符. 同样,使用“%”从结尾截断字符串:
$ MYFOO =“ chickensoup.tar.gz”
$ echo $ {MYFOO %%. *}
鸡肉汤
$ echo $ {MYFOO%. *}
chickensoup.tar
如果您忘记应该使用“#”还是“%”,请查看键盘上的3、4和5键并进行猜测.
还有另一种形式的变量扩展来选择特定的子字符串.
$ EXCLAIM = Cowabunga
$ echo $ {EXCLAIM: 0: 3}
牛
$ echo $ {EXCLAIM: 3: 7}
丰盛

请注意命令替换$()和截断的字符串$ {}
之间的区别
应用字符串截断
以下是一个简单的shell脚本,该脚本接受一个文件作为参数,然后打印: 该文件是否为tar文件.
#! / bin / bash
如果[“ $ {1 ## *. }” =“ tar”]
然后
回声这似乎是手球.
其他
回声乍一看,这似乎不是压缩包.
fi
查看以上示例中使用的“ if”语句. 语句中使用布尔表达式. 在bash中,“ =”比较运算符检查字符串是否相等. 在bash中,所有布尔表达式都放在方括号中.
($ 1是传递给脚本的第一个命令行参数,$ 2是第二个,依此类推. )
If语句
如果[条件]
然后
动作
fi
仅当条件为true时,该语句才执行该操作,否则,该操作将不执行,并且继续执行“ fi”之后的语句.
如果[条件]
然后
动作
elif [condition2]
然后
action2
.
.
.
elif [condition3]
然后
其他
actionx
fi
上面的“ elif”形式将连续测试每个条件并执行满足第一个真实条件的操作. 如果没有条件成立,则将执行“ else”操作. 如果条件为真,则“ if,elif,else”语句之后的整行将继续.
Bash编程示例2
在之前的bash入门文章中,我们了解了脚本语言的一些基本元素以及使用bash的原因. 在本文(第二部分)中,我将继续前一篇文章,并解释if-then语句,循环等的基本结构.
Bash编程示例
第2部分
接收自变量
看下面的例子:
#! / bin / bash
脚本的回显名称为$ 0
第一个参数为$ 1
第二个参数为$ 2
第17个参数为$ 17
回显参数为$#
Bash将“ $ 0”扩展为从命令行调用的脚本的名称,而“ $#”扩展为传递给脚本的参数的数量. (请注意,$和0已连接)
在Bash编程中shell 编程实例,有时有时需要一次引用所有命令行参数. 为此,bash实现了变量“ $ @”,该变量被扩展为所有用空格分隔的命令行参数.
Bash编程结构
Bash有其自己的标准编程结构版本,例如以各种编程语言显示的“ if”语句和“ for”循环. 以下各节将介绍几种bash结构,并说明这些结构与其他编程语言之间的区别.
方便的条件语句
在C语言中,要比较特定文件是否比另一个文件新,必须使用两个stat()调用和两个stat结构进行手动比较. 在bash中,由于它具有内置的标准文件比较运算符,因此很容易确定“ / tmp / myfile是否可读”并查看“ $ myvar是否大于4”. 请参见以下示例:
如果[-z“ $ myvar”]
然后
回显“未定义myvar”
fi
上面的示例表明,如果未定义$ myvar(即$ myvar为0),则回显“ ...
bash中可用的比较运算符如下:
操作员描述示例
文件比较运算符
-e如果文件名存在[-e / var / log / syslog],则文件名为true
如果文件名是目录[-d / tmp / mydir],
-d文件名为true
如果文件名是常规文件[-f / usr / bin / grep],
-f文件名为true
如果文件名是符号链接[-L / usr / bin / grep],
-L文件名为true

-r文件名为true,如果文件名可读[-r / var / log / syslog]
-w filename如果文件名可写[-w / var / mytmp.txt]为true
-x如果文件名可执行[-L / usr / bin / grep],则文件名为true
如果filename1比filename2更新,则filename1-nt filename2为true [/ tmp / install / etc / services -nt / etc / services]
如果filename1早于filename2,则filename1-ot filename2为true [/ boot / bzImage -ot arch / i386 / boot / bzImage]
字符串比较运算符(请注意引号的使用,这是防止空格干扰代码的好方法)
-z字符串为真,如果字符串的长度为零[-z“ $ myvar”]
-n字符串为真shell 编程实例,如果字符串的长度不为零[-n“ $ myvar”]
string1 =如果string1与string2相同,则string2为true [“ $ myvar” =“一二三”]
string1! =如果string1和string2不同,则string2为true [“ $ myvar”! =“一二三”]
算术比较运算符
num1-eq num2等于[3- -eq $ mynum]
num1-ne num2不等于[3 -ne $ mynum]
num1-lt num2小于[3 -lt $ mynum]
num1-le num2小于或等于[3-le $ mynum]
num1-gt num2大于[3 -gt $ mynum]
num1-ge num2大于或等于[3-ge $ mynum]
有时候,有几种不同的方法可以进行特定的比较. 如下:
if [“ $ myvar” -eq 3]
然后
回声“ myvarequals 3”
fi
如果[“ $ myvar” =“ 3”]
然后
回声“ myvarequals 3”
fi
以上两个比较执行相同的功能,但第一个使用算术比较运算符,第二个使用字符串比较运算符.
字符串比较说明
大多数时候,尽管不能在字符串和字符串变量周围使用双引号,但这并不是一个好主意. 因为如果环境变量中有空格或Tab键,则bash将无法区分它并且将无法正常工作. 这是一个错误的比较示例:
如果[$ myvar =“ foo bar oni”]
然后
回声“是”
fi
在上面的示例中,如果myvar等于“ foo”,则代码将按预期工作,而无需打印. 但是,如果myvar等于“ foo baroni”,则代码将失败,并显示以下错误:
[: 参数过多
在这种情况下,“ $ myvar”(等于“ foo baroni”)中的空格会混淆bash. bash展开“ $ myvar”后,代码如下:
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-198627-1.html
他马云搞互联网也可能的确不需要行贿
商会是政府办的么
十年96到06年