1、shell编程基础
•1.1 shell编程概述
• Shell是介于用户和系统内核之间的,用于解释用户输入命令的解释器。
•在Linux系统中支持的shell类型有:
•bash “Bourne Again Shell
•sh Bourne shell很多UNIX系统下的标准的shell
•csh c shell与c语言语法相近,大部分UNIX下有效
•ksh public domain Korn shell
•tcsh 微型C shell, 在小的系统里经常使用
•通常Linux系统的shell类型为bash
•查看系统shell类型: echo $SHELL
$SHELL是一个环境变量,它记录用户所使用的shell类型。你可以用命令:
#shell-name
来转换到别的shell,这里shell-name是你想要尝试使用的shell的名称,如ash等。这个命令为用户又启动了一个shell,这个shell在最初登录的那个shell之后,称为下级的shell或子shell。使用命令:
$exit
可以退出这个子shell。
•Shell脚本编写规范:
可以使用vim编辑器编辑一个shell脚本程序。
vim /hello.sh打开文件,内容如下:
• #!/bin/bash -------(1)
• echo “hello world !” -------(2)
•
(1)bash shell脚本的第一行需要以#!开头,表示文件是可执行的shell脚本;/bin/bash表示执行该脚本文件内容的命令解释器为bash。
(2)echo “hello world !”表示输出“hello world !”的内容。
执行一个shell脚本
•首先将shell的脚本设置成可执行
chmod +x filename
执行方法1:shell名+要执行的脚本
执行方法2:
•pdksh 和Bash: ./
•Tcsh: source
——————————————————————
• /hello.sh #绝对路径法
• bash /hello.sh #指定shell类型为bash执行
• . hello.sh #用符号“.”代替bash执行
在方法1中,脚本设置如下:
1、对于Bourne:第一个非空白字符不是#
2、对于C Bourne:第一个非空白字符是#但不是#!
3、用户自定义:第一个非空白字符是#! 则后面定义shell
举例:
Bourne: echo test
或 #!/bin/sh
•1.2 显示输出
• 通过将文本作为参数传递给命令,echo命令可用于显示任意文本
echo “hello world”
•但有时输出时,输出的对象中的特殊字符在特定上下文中有特殊含义,而达不到预期。
如: echo $SHELL
echo `date`
•可能我们期望输出的是$SHELL和`date`字符本身,但事实上会输出SHELL变量的值和date作为Linux命令执行的结果。
•如果不需要这种特殊含义,而只保留字面的值,那么可以对输出对象加转义字符 \,单引号‘’或双引号“”来禁用特殊字符或单词的含义。
双引号“”(让引号内的变量生效)
单引号‘’(引号内的变量当作一个字符使用)
反斜线\(禁用特殊字符功能\$)
后引号``(让引号内的命令生效)
•转义字符\可以取消该字符后面的单个字符的特殊含义。
echo # not a comment
echo \# not a comment
echo # # not a comment
echo \# # not a comment
echo \# not a comment #
echo \# \# not a comment
•结论:转义字符只能转义一个字符,可以多次使用转义字符对多个字符进行转义。
反斜线
使用反斜线是从shell中隐藏特定字符的方法。与单引号一样,反斜线隐藏shell中所有的特定字符,但与字符组相反,它一次只能隐藏一个字符。
dialogue=how\ about
set dialogue=how\ about
此命令隐藏shell中的空格,并将字符串how about赋值给变量dialogue
•单引号功能:可以保留单引号括起来的所有字符的字面含义。
•示例:
echo ‘# not a comment’
echo‘# not a comment #’
echo‘\# not a comment \#’
echo ‘”hello world ”’
echo $SHELL
echo‘$$SHELL’
单引号
可将所有特定字符从shell中隐藏起来。它在输入的命令是程序而不是shell时尤为有用。例如,用户可以用单引号将how about赋值给变量,但是有时候不能使用这种方法。如果赋值给变量的字符串包含另一个变量,就必须使用双引号。
dialogue=“how about $LOGNAME”
set dialogue=“how about $LOGNAME”
如果登陆为root,这些命令将值how about root存储在变量dialogue中,如果单引号,单引号将把shell中的美元符号隐藏起来,因此,变量dialogue被赋值为how about $LOGNAME
•双引号:不保留美元符号$,反引号``和反斜杠\的字面值,保留其它字符的字面值。
•示例:
echo ‘$HOME’
echo “$HOME”
echo ‘`pwd`’
echo “`pwd`”
echo “\$SHELL”
echo ‘\$SHELL’
双引号
如果字符串在双引号中,则所有空白字符都从shell中隐藏起来,而所有其他特殊字符依然被翻译出来。这种方法在将包含一个以上单词的字符串赋值给变量的时候最有用。例如,将字符串how about赋值给变量dialogue
dialogue = “how about” (pdksh与bash)
set greeting = “how about” (tcsh)
•1.3 基础正则
•正则表达式:使用某种模式去匹配一类字符串的公式,是由一串字符和元字符构成的字符串,元字符是用以阐述字符表达式的内容、转换各种操作信息的字符,正则表达式在Perl,Python和C语言等都有应用。
•
•基础正则:
•
1、“.”一个点
功能:用于匹配除换行符\n以外的任意一个字符
例:
grep r.t test.txt #匹配test.txt文件中r和t之间只有一个字符的行
grep r..t test.txt #匹配test.txt文件中r和t之间有两个字符的行
正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。
正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。
2、“*”星号,功能:用于匹配前一个字符0次或任意多次。
例:
grep ab* test.txt #匹配包含a或者ab,abb……等字符的行
grep ab.* test.txt #匹配ab后面有任意多字符的行
.*可以匹配除换行符以外的任意长度的字符
3、“\{n,m\}”符号,功能:精确控制匹配前面字符的倍数n次到m次。
有三种形式:
\{n\}:匹配前面字符n次 grep “ra\{2\}” test.txt
\{n,\}:匹配前面字符至少n次 grep “ra\{2,\}” test.txt
\{n,m\}:匹配前面字符n到m次 grep “ra\{2,4\}”test.txt
4、“^”符号:尖角号,用于匹配开头的字符
grep ^root /etc/passwd
5、“$”符号:用于匹配以某字符结尾的行
grep /bin/shell$ /etc/passwd
6、”[ ]“符号
功能:用于匹配[ ]出现的任意一个字符。
用法示例:
grep [ABCD] text.txt #匹配文件中包含ABCD任意一个字符的行
grep [A-Z] test.txt #匹配文件中包含大写字母的行
grep [a-z] test.txt #匹配文件中包含小写字母的行
grep 1[38][0-9]\{9\} test.txt #匹配文件中的手机号
7、”\<“和”\>“符号
功能:用于界定单词的左右边界,从而匹配包含某个单词的行
用法示例:
grep \<hello text.txt #匹配文件中单词以hello字符开头
grep hello\> text.txt #匹配文件中单词以hello字符结尾
grep \<hello\> text.txt #匹配文件中包含单词hello的行
注意:Linux系统下的单词由大小写字母,数字,下划线组成,其它的字符都被认为是单词分割符。
•1.4 扩展正则
扩展正则是基础正则表达式的补充。
使用扩展正则需要使用egrep或grep –E来实现。
扩展正则:
1、“?”符号
功能:用于匹配前一个字符0次或1次
grep -E ra?t test.txt #匹配test.txt文件中ra和rat字符的行。
2、“+”符号
功能:用于匹配前一个字符至少1次
grep -E ra+t test.txt
#匹配test.txt文件中rat、raat、raaat……字符的行。
3、“|”符号
功能:表示“或”的关系,多种可能的罗列。
grep -E ‘cat|dog’test.txt
表示匹配文件中区号为2位或3位的电话号码