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 '\*' ./* 正确
变量
Linux中的字符串,单引号,双引号
字符串中的每个字符多是以下两种中的一个,
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 有以下三种方法:
用法:
举例:
举例:
将 /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} 并沒有啥不同,可是用 ${} 会比较精确的界定变量名称的范围,主要用于字符串拼接的时候。比方,
判断方法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的执行方式:
shell十三问