Linux 入门 2 (正则表达式和 Shell Script)
Shell 通配符(wildcard)
初学者容易将通配符和正则表达式弄混淆。
通配符(wildcard)即,*,?,[-],[^],[],等只适用于shell命令行中的path参数(路径名,文件名);对于非shell的应用而言,没有wildcard这个概念。
| * | 代表『 0 个或无穷多个』任意字符 |
| ? | 代表『一定有一个』任意字符 |
| [ ] |
同样代表『一定有一个在括号内』的字符(非任意字符)。例如 [abcd] 代表『一定有一个字符, 可能是 a, b, c, d 这四个任何一个』 |
| [ - ] |
若有减号在中括号内时,代表『在编码顺序内的所有字符』。例如 [0-9] 代表 0 到 9 之间的所有数字,因为数字的语系编码是连续的! |
| [^ ] |
若中括号内的第一个字符为指数符号 (^) ,那表示『反向选择』,例如 [^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* 可达到目的
正则表达式: 用在字符串处理上面的一项表达式,主用用于文本内容中的字符串搜索和替换。
正则表达式是一种”表示法“,只要工具程序支持这种表示法,那么该工具程序就可以作为正则表达式的字符串处理之用。
支持正则表达式的工具: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十三问

浙公网安备 33010602011771号