04-Shell编程之一

1、shell编程基础

1.1 shell编程概述

Shell是介于用户和系统内核之间的,用于解释用户输入命令的解释器。

Linux系统中支持的shell类型有:

bash  “Bourne Again Shell

sh        Bourne shell很多UNIX系统下的标准的shell

csh      c shellc语言语法相近,大部分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

1bash shell脚本的第一行需要以#!开头,表示文件是可执行的shell脚本;/bin/bash表示执行该脚本文件内容的命令解释器为bash

2echo hello world !”表示输出“hello world !”的内容。


执行一个shell脚本

首先将shell的脚本设置成可执行

chmod +x filename

执行方法1shell+要执行的脚本

执行方法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”  (pdkshbash)

  set greeting = “how about”  (tcsh)


1.3 基础正则

正则表达式使用某种模式去匹配一类字符串的公式,是由一串字符和元字符构成的字符串元字符是用以阐述字符表达式的内容、转换各种操作信息的字符,正则表达式在PerlPythonC语言等都有应用。

基础正则:

1、“.”一个点

功能:用于匹配除换行符\n以外的任意一个字符

例:

grep  r.t  test.txt   #匹配test.txt文件中rt之间只有一个字符的行

grep  r..t test.txt   #匹配test.txt文件中rt之间有两个字符的行

正则表达式(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

  \{nm\}:匹配前面字符nmgrep “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 \ text.txt #匹配文件中单词以hello字符开头

 grep hello\> text.txt #匹配文件中单词以hello字符结尾

 grep \ text.txt #匹配文件中包含单词hello的行

 

注意:Linux系统下的单词由大小写字母,数字,下划线组成,其它的字符都被认为是单词分割符。


1.4 扩展正则

扩展正则是基础正则表达式的补充。

使用扩展正则需要使用egrepgrep –E来实现。

扩展正则:

1、“?”符号

  功能:用于匹配前一个字符0次或1

    grep -E  rat  test.txt   #匹配test.txt文件中rarat字符的行。


2、“+”符号

  功能:用于匹配前一个字符至少1

   grep -E ra+t  test.txt  

  #匹配test.txt文件中ratraatraaat……字符的行。


3、“|”符号

功能:表示“或”的关系,多种可能的罗列。

 grep -E cat|dogtest.txt

表示匹配文件中区号为2位或3位的电话号码


2、shell变量管理

3、shell运算符

4、流程控制语句和函数

5、shell编程范例

6、常用操作命令

你可能感兴趣的:(04-Shell编程之一)