由于这里是在bash下做的实验,有些地方与csh略有不同,详情:
http://www.cnblogs.com/itech/archive/2012/02/21/2361184.html
一、linux命令中的特殊字符
1. 双引号"
(1)打印输出时将系统保留符号屏蔽、以保证正常输入,如:
echo Alix; Mary
echo "Alix; Mary"
*分号;表示一个命令结束、另一个 命令开始执行,如果不加"的话,则只输出Alix,执行到Mary时会报错
(2)在双引号中引用其他命令输出符,如引用变量:
name="mary"
echo "Alix;$name"
echo "$name"
*当然,在第三行命令中不加”也能执行出正确的结果,但是为了在编写大型脚本时降低错误率,建议养成把特殊引用符都放到“内的良好习惯
此外,还可以直接引用命令输出,这时要用反引号`把命令字括起来(下面会详细讲道):
echo "Now time: `date -u` "
(3)在命令中使用双引号避免shell误解,如:
name="jhon alix jack;mary roman"
echo $name | grep "jhon alix"
echo $name | grep jhon alix
第二行由于使用了",能够正确执行、找到包含jhon alix的变量,但如果不加、第三行命令会报错。
2. 单引号‘
单引号的用途和双引号一致,此外还表示引用中的引用,因为shell中不允许一条命令中的两个引号都使用双引号或单引号;如:
awk 'BEGIN{system("date")}'
3. 反引号`:命令引用符,如:
ls -l `cat /etc/shells`
echo "Now time: `date +'%T'`"
echo "Are using this system users: `who | awk '{ARR [FNR]=$1;}END {printf "%s %s\n" ,ARR[1],Arr[2];}'`"
4. 变量引用和命令转换符$,如:
#将命令date的执行结果赋给变量a
a=`date`
echo "The time is: $a"
#如果是csh,需要在变量名前面加set
#下面的格式,只能在bash里用,csh里会只能用ls -l `cat /etc/shells`实现该功能
ls -l $(cat /etc/shells)
5. 屏蔽特殊符号字符\,如:
#bash格式
echo "Please pay \$15."
echo "Tom:\"What is your name?\""
/*下面6、7两条讲的是文件名通配符,要和文件内容的匹配符区分开*/
6. 字符范围匹配符[]
#查看当前目录中以kls中任意字幕开头的所有文件:
ls -l [kls]*
#查看文件名中包含0~9的文件:
ls -l *[0-9]*
#查看文件名中包含a~Z的文件:
ls -l *[a-Z]*
7. 范围排除[!]
#查看文件名是三个字符且第一个在0~9范围、第二个不在0~9范围、第三个任意的文件:
ls -l [0-9][!0-9]*
*此外还有单字通配符?,多字通配符*
8. 逻辑或||
command1 || command2
先执行command1,如果成功则直接显示结果、跳过command2;否则再执行command2
例1:
mail -f /root/mbox >/dev/null || echo "Permission denied"
9. 逻辑与&&
command1 && command2
和逻辑或相反,先执行command1,如果成功,才执行command2;否则执行终止:
wget http://www.baidu.com &>/dev/null && echo "`date` Host baidu service is running."
可以和下面的语句比较一下结果的不同:
wget http://www.baidu.com || echo "`date` Host baidu service is running."
10. 括号:
如果将命令放到圆括号内,执行多命令时会优先执行括号内的命令;而花括号则在函数中被使用(见第17章)
二、命令中的正则表达式:
正则表达式不止在shell脚本中使用,平时在grep、vi、awk、sed等命令工具中也可以使用。
1. 与文件名匹配同理,使用反斜杠\屏蔽特殊字符,如:
# ; $ ` " . ^ ? [ ] \ || &&
(1)比如做乘法运算时:
expr 25 \* 25
625
(2)在命令中输出特殊符号:
echo \#notes\\
#notes\
(3)表示文件名^^.txt
/\^\^\.txt/
2. 单字符匹配符.
*使用查找模式时,通常要将表达式放入两个斜杠 //中,然后再放入命令中。后面不在赘述。
/.i../,有可能匹配到xian,就这个意思。
3. *单/多字符匹配符
4. 行首匹配符^
用来匹配每一行第一列中符合搜索条件的字符串:
/^eth0/
5. 行尾匹配符$
与上面类似,用来匹配行尾符合搜索条件的字符串:
/love$/
虽然其他行也有love这个词,但如果它不在行尾、就不会被搜索到
6. 范围匹配[ ]和排除范围匹配符[^],使用方式如下:
[a-Z] (等同于[a-z A-Z])
/[Ll]ove/
[0-9]
[^a-Z]
7. 词首\<、词尾匹配符\>:
搜索以eth0四个字符开头的文本:
grep -rl "\<eth0" *
*这里注意和^$区别
搜索以love结尾的文本:
grep -rl /love\>/ *
搜索包含整个单词the的文本:
grep -rl /\<dropped\>/ *
8. 重复次数匹配符 X\{\}
搜索当前文件夹下字母r出现2次的文本:
grep -rl "r\{2\}" *
搜索当前文件夹下字母r至少出现2次的文本:
grep -rl "r\{2,\}" *
搜索当前文件夹下字母r出现2至10次的文本:
grep -rl "r\{2,10\}" *
搜索当前文件夹下单词Link至少出现1次的文本:grep -rl "Link\{1,\}" *
9. 正则表达式举例:
搜索包含IP地址的文件:
grep -rl "[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}" *