Linux 入门 2 (正则表达式和 Shell Script)

Shell 通配符(wildcard)html

  初学者容易将通配符和正则表达式弄混淆。正则表达式

  通配符(wildcard)即,*,?,[-],[^],[],等只适用于shell命令行中的path参数(路径名文件名;对于非shell的应用而言,没有wildcard这个概念。shell

*                   表明『 0 个或无穷多个』任意字符 
表明『必定有一个』任意字符 
[ ] 

一样表明『必定有一个在括号内』的字符(非任意字符)。例如 [abcd] 表明『必定有一个字符,express

多是 a, b, c, d 这四个任何一个』vim

[ - ] 

如有减号在中括号内时,表明『在编码顺序内的全部字符』。例如 [0-9] 表明 0 到 9 之间的全部数字,由于数字的语系编码是连续的!bash

[^ ] 

若中括号内的第一个字符为指数符号 (^) ,那表示『反向选择』,例如 [^abc] 表明 必定有一个字符,只要是非 a, b, c 的其余字符就接受的意思。工具

  举例:列出当前目录下文件名含字母b的文件信息,编码

drwxr-xr-x 8 srsy users 4096 Jul  6 11:03 .
drwxr-xr-x 5 root root  4096 Jul  5 23:25 ..
-rw------- 1 srsy users 1027 Jul  6 00:04 .bash_history
-rw-r--r-- 1 srsy users 1177 Jul  5 23:25 .bashrc
-rw-r--r-- 1 srsy users 1637 Jul  5 23:25 .emacs
drwxr-xr-x 2 srsy users 4096 Jul  5 23:25 .fonts
-rw-r--r-- 1 srsy users  861 Jul  5 23:25 .inputrc
drwxr-xr-x 2 srsy users 4096 Jul  5 23:25 .mozilla
-rw-r--r-- 1 srsy users 1028 Jul  5 23:25 .profile
-rw------- 1 srsy users  578 Jul  5 20:15 .viminfo
-rw-r--r-- 1 srsy users 1940 Jul  5 23:25 .xim.template
-rwxr-xr-x 1 srsy users 1446 Jul  5 23:25 .xinitrc.template
drwxr-xr-x 2 srsy users 4096 Jul  5 23:25 Documents
-rw-r--r-- 1 srsy users 2128 Jul  5 20:17 aaa
drwxr-xr-x 2 srsy users 4096 Jul  5 23:25 bin
drwxr-xr-x 2 srsy users 4096 Jul  5 23:25 public_html
-rw-r--r-- 1 srsy users  650 Jan 26  2005 regular_express.txt
drwxr-xr-x 7 root root  4096 Jul  5 17:10 vmware-tools-distrib

 

  ls -al ./*b*  可达到目的spa

 

正则表达式: 用在字符串处理上面的一项表达式,主用用于文本内容中的字符串搜索和替换命令行

  正则表达式是一种”表示法“,只要工具程序支持这种表示法,那么该工具程序就能够做为正则表达式的字符串处理之用。

  支持正则表达式的工具:vim, grep, awk, sed.

 

  从ls -al ./ 返回结果(字符串)中,筛选出含有b的行:

  ls -al ./ | grep '.*b.*'  这个是对的,用正则表达式

  ls -al ./ | grep *b*    这个是错的,想用通配符,可是这里不适用。

 

  举例:找出~目录下含有字符*的文件

  grep '\*' ./       错误

  grep '\*' ./*       正确

 


  变量   

  • var=abc 或者'abc' 或者"abc"  变量为var,赋值为abc,Linux中变量是没有类型的,就是字符串,不管是否加引号都被看做是字符串
  • $ : 引用一个变量的内容。

Linux中的字符串,单引号,双引号

   字符串中的每个字符多是以下两种中的一个,

  • literal:也就是普通纯文字,对 shell 来讲沒特殊功能。好比,aabc,113adag,等
  • meta:对 shell 来讲,具备特定功能的特殊保留字元。好比,字符串中包含IFS(space,tab,enter)、CR、以及(),[],=,$,&,等等

  Shell的 command line 包含三部分:command_name option argument ,shell会依据 IFS (Internal Field Seperator) 将 command line 所输入的文字给拆解为"字段"(word)。而后再针对特殊字符(meta)先做处理,最后再重组整行 command line. 用户输入完命令行后,按enter健后会产生CR,Carriage Return,告诉 shell: 老兄你能够执行个人命令行了。 

   假如咱们须要在 command line 中将这些meta保留字元的功能关闭的话,就须要 quoting 处理了,在 bash 中,经常使用的 quoting 有以下三种方法:

  •  hard quote:' ' (单引号)  凡在 hard quote 中的全部 meta 均被关闭。
  •  soft quote: " " (双引号)   在 soft quoe 中大部份 meta 都会被关闭,但某些则保留(如 $ )。(注二) 
  •  escape : \ (反斜线)    只有紧接在 escape (跳脫字符)以后的单一 meta 才被关闭。 

  用法:

  •   对于普通纯文字的字符串,能够不加引号,能够加单引号或双引号
  •   对于包含meta的字符串,看状况加单引号或双引号

  举例:

  •   x=aa\nbb    显示结果为:aanbb
  •   x='aa\nbb'    显示结果为:aa\nbb
  •   x="aa\nbb"   显示结果为:aa\nbb
  •   x=aa bb      运行出错,提示 -bash: bb: command not found
  • touch "test me" 和 touch test me
  • echo "'$PATH'" 和 echo '$PATH'
  • echo "*" 和 echo *
  • ls "~" 和 ls ~
  • ls "> out1" 和 ls > out1
  • 我想显示“root",则 a=\"$USER\" 或者 a="\"$USER\"",不能 a=‘\"$SUER\"'

  举例:

  将 /etc/passwd 的第一栏叏出,并且每一栏都以一行字符串『The 1 account is "root" 』来显示,那个 1 表示行数。

  awk 'BEGIN {FS=":"} {print "The " NR " account is:\t" \" $1 \"}' /etc/passwd   提示出错:^ backslash not last character on line

  awk 'BEGIN {FS=":"} {print "The " NR " account is:\t" """ ($1) """}' /etc/passwd  结果是:The 1 account is:        ($1)

  awk 'BEGIN {FS=":"} {print "The " NR " account is:\t" "\"" $1 "\""}' /etc/passwd  这样才能输出”root"这种带引号的格式

 

 

`` 和 $() : 

  $(command) 与 `command` (反引号) 都是用来作命令替换用(command substitution)的。所谓的命令替换与咱们第五章学过的变量替换差很少,都是用来着组命令行,即:完成反引号或括号里的命令行,而后将其结果替换出来,再着组新命令行。如,

  # echo the last sunday is $(date -d "last sunday" +%Y-%m-%d)  先执行$()里的命令,获得的结果从新组装到命令echo参数中

${} : 

  ${var} 其实就是用来做变量替换用的啦。通常情況下,$var 与 ${var} 并沒有啥不同,可是用 ${} 会比较精确的界定变量名称的范围,主要用于字符串拼接的时候。比方,

  • # echo $AB     将认为是变量AB
  • # echo ${A}B   将变量A添加一个字符'B'

判断方法test 和 [] : 《鸟叔P382》

  [ "$HOME" == "/root " ];echo $?  注意格式。变量?记录上一条指令的结果。为0表示执行成功,反之失败     

  [ "$yn" == "Y" -o "$yn" == "y" ] && echo "OK,continue" && exit 0

  中括号的使用方法和test几乎同样。只是中括号常常用在条件判断式if...then...fi的状况中就是了 

  [ "$yn" == "Y" -o "$yn" == "y" ] 等效于 [ "$yn" == "Y" ] || [ "$yn" == "y" ]  

Linux中的字符串,单引号,双引号 

  $(command) 

 

 

 

 


 

 script的执行方式:

  •  直接执行
  •  利用source或小数点(.)执行

 

shell十三问

相关文章
相关标签/搜索