无论你使用哪种文字编辑器来编写shell脚本,它必须以#!/bin/sh开始(必须放在文件的第一行):
例如:
#!/bin/sh
...
符号#!用来告诉系统执行该脚本的程序,本例使用/bin/sh。
编辑结束并保存后,如果要执行该脚本,必须先使其可执行:chmod +x filename
此后在该脚本所在目录下,输入 ./filename 即可执行该脚本。
如果要取用一个变量的值,只需在变量名前面加一个$
看例子:
#!/bin/sh
a="hello world" #等号两边均不能有空格存在
echo "A is:" $a
结果:A is: hello world
看下边两个例子,不要搞混阿。
例子1:
num=2
echo "this is the $numnd"
上述脚本并不会输出"this is the 2nd"而是"this is the ";这是由于shell会去搜索变量numnd的值,而实际上这个变量此时并没有值。
例子2:
num=2
echo "this is the ${num}nd"
其输出结果为:this is the 2nd
if语句:
if ....; then
....
elif ....; then
....
else
....
fi
测试命令:
[ -f "somefile" ] :判断是否是一个文件
[ -x "/bin/ls" ] :判断/bin/ls是否存在并有可执行权限
[ -n "$var" ] :判断$var变量是否有值
[ "$a" = "$b" ] :判断$a和$b是否相等
&&和||操作符:
[ -f "/etc/shadow" ] && echo "This computer uses shadow passwords"
该脚本表示如果/etc/shadow文件存在,则打印”This computer uses shadow passwords”。
#!/bin/sh
mailfolder=/var/spool/mail/james
[ -r "$mailfolder" ] || { echo "Can not read $mailfolder" ; exit 1; }
echo "$mailfolder has mail from:"
grep "^From " $mailfolder
如果/var/spool/mail/james不存在或者不可读,则打印Can not read /var/spool/mail/james并退出。
如果/var/spool/mail/james存在但是文件里没有以Form开始的行,则打印/var/spool/mail/james
如果/var/spool/mail/james存在而且文件里也有以Form开始的行,则打印
/var/spool/mail/james has mail from:
From dfggdfklgjdghlkgjh(这是以Form开始的行)
case语句:
case ... in
...) do something here ;;
esac
case表达式可以用来匹配一个给定的字符串,而不是数字(可别和C语言里的switch...case混淆)。
select语句:
select var in ... ; do
break;
done
.... now $var can be used ....
例如:
#!/bin/sh
echo "What is your favourite OS?"
select var in "Linux" "Gnu Hurd" "Free BSD" "Other"; do
break;
done
echo "You have selected $var"
结果:
What is your favourite OS?
1) Linux
2) Gnu Hurd
3) Free BSD
4) Other
#? 1
You have selected Linux
如果 以上脚本运行出现 select :NOT FOUND 将 #!/bin/sh 改为 #!/bin/bash
while/for循环:
while ...; do
....
done
只要测试表达式条件为真,则while循环将一直运行。关键字"break"用来跳出循环,而关键字”continue”则可以跳过一个循环的余下部分,直接跳到下一次循环中。
for var in ....; do
....
done
看例子:
#!/bin/sh
for var in A B C ; do
echo "var is $var"
done
结果:
var is A
var is B
var is C
引号:
在shell中引号分为三种:单引号,双引号和反引号。
单引号 ‘
由单引号括起来的字符都作为普通字符出现。特殊字符用单引号括起来以后,也会失去原有意义,而只作为普通字符解释。
双引号 “
由双引号括起来的字符,除$、、’、和”这几个字符仍是特殊字符并保留其特殊功能外,其余字符仍作为普通字符对待
反引号 `
反引号(`)这个字符所对应的键一般位于键盘的左上角,不要将其同单引号(’)混淆。
反引号括起来的字符串被shell解释为命令行,在执行时,shell首先执行该命令行,并以它的标准输出结果取代整个反引号(包括两个反引号)部分
#!/bin/sh
echo *.jpg
echo "*.jpg"
echo '*.jpg'
结果:
mail.jpg tux.jpg
*.jpg
*.jpg
例子:
#!/bin/sh
echo $SHELL
echo "$SHELL"
echo '$SHELL'
结果:
/bin/bash
/bin/bash
$SHELL
此外还有一种防止这种扩展的方法,即使用转义字符——反斜杆:\:
例子:
echo \*.jpg
echo \$SHELL
结果:
*.jpg
$SHELL
注释符
shell编程中经常要对某些正文行进行注释,增加程序的可读性。在Shell中以字符“#”开头的正文行表示注释行。
此外还有一些特殊字符如:用于输入/输出重定向与管道的<、>、<<、>>和|;执行后台命令的&;命令执行操作符&&和||及表示命令组的{}。
#!/bin/sha=`ls -l`echo $a# 别忘了,这么引用的话,ls 的结果中的所有空白部分都没了(包括换行)echoecho "$a"# 这么引用就正常了,保留了空白上边大多摘自:%E7%BC%96%E7%A8%8B%E5%9F%BA%E7%A1%80
grep正则表达式元字符集(基本集)
^
锚定行的开始 如:'^grep'匹配所有以grep开头的行。
$
锚定行的结束 如:'grep$'匹配所有以grep结尾的行
匹配一个非换行符的字符 如:'gr.p'匹配gr后接一个任意字符,然后是p。
*
匹配零个或多个先前字符 如:'*grep'匹配所有一个或多个空格后紧跟grep的行。 .*一起用代表任意字符。
[]
匹配一个指定范围内的字符,如'[Gg]rep'匹配Grep和grep。
[^]
匹配一个不在指定范围内的字符,如:'[^A-FH-Z]rep'匹配不包含A-R和T-Z的一个字母开头,紧跟rep的行。
特别需要注意的是,连字符“-”仅在方括号内有效,表示字符范围,如在方括号外面就成为普通字符了。
\(..\)
标记匹配字符,如'\(love\)',love被标记为1。
\<
锚定单词的开始,如:'\\>
锚定单词的结束,如'grep\>'匹配包含以grep结尾的单词的行。
x\{m\}
重复字符x,m次,如:'0\{5\}'匹配包含5个o的行。
x\{m,\}
重复字符x,至少m次,如:'o\{5,\}'匹配至少有5个o的行。
x\{m,n\}
重复字符x,至少m次,不多于n次,如:'o\{5,10\}'匹配5--10个o的行。
\w
匹配文字和数字字符,也就是[A-Za-z0-9],如:'G\w*p'匹配以G后跟零个或多个文字或数字字符,然后是p。
\W
\w的反置形式,匹配一个或多个非单词字符,如点号句号等。
\b
单词锁定符,如: '\bgrepb\'只匹配grep。
用于egrep和 grep -E的元字符扩展集
+
匹配一个或多个先前的字符。如:'[a-z]+able',匹配一个或多个小写字母后跟able的串,如loveable,enable,disable等。
?
匹配零个或多个先前的字符。如:'gr?p'匹配gr后跟一个或没有字符,然后是p的行。
a|b|c
匹配a或b或c。如:grep|sed匹配grep或sed
()
分组符号,如:love(able|rs)ov+匹配loveable或lovers,匹配一个或多个ov。
x{m},x{m,},x{m,n}
作用同x\{m\},x\{m,\},x\{m,n\}
摘录网址:
学习资料:
阅读(553) | 评论(0) | 转发(0) |