一、Shell
-
注释,解释器
Shell 脚本中用#表示注释,相当于 C 语言的//注释。但如果#位于第一行开头,并且是#!(称为 Shebang)则例外,它表示该脚本使用后面指定的解释器/bin/sh 解释执行。如果把这个脚本文件加上可执行权限然后执行。 -
运行脚本
. 脚本名
./脚本名
source 脚本名
/bin/bash 脚本名 -
shell语法
a.数据类型
字符串String (只有这一种)
b.变量
变量建议大写
本地变量----(局部变量) 默认为本地变量
环境变量----(全局变量)
注意等号两边都不能有空格,否则会被 Shell 解释成命令和命令行参数。
声明变量:itcast$ VAR=10(本地变量 VAR 的值是字符串10 而非整数)
itcast$ export VAR(将本地变量转换为全局变量)
itcast$ env | grep VAR
得到SVAR=10
env:查询环境变量
删除变量:itcast$ unset VAR
c.函数
d.面向对象(shell不支持)
继承、重载、封装、多态…
e.框架3.1 test条件测试
命令 test 或 [ 可以测试一个条件是否成立,真:0 假:1
Test 测试条件
[空格 测试条件
itcast$ VAR=10
itcast$ test $var -gt 100或[ v a r − g t 100 只 执 行 , 但 不 会 返 回 结 果 ) i t c a s t var -gt 100只执行,但不会返回结果) itcast var−gt100只执行,但不会返回结果)itcast echo $?(查看上一个命令执行的结果)整数判别符:(只能用在整数之间)
-eq(等于)
-ne(不等于)
-gt(大于)
-lt(小于)
-ge(大于等于)
-le(小于等于)文件类型判别符:
-d 目录文件
-f 普通文件
-p 管道
-l 软连接
-c 字符设备
-b 块设备
-s socket字符串长度判断:
[ -z STRING ] 如果 STRING 的长度为零则为真
[ -n STRING ] 如果 STRING 的长度非零则为真逻辑运算:与、或、非
-a ---- &&逻辑与,
-o ---- ||逻辑或,
! 逻辑非3.2 if分支
if/then/elif/else/fi
If [ 判断条件 ];then
执行内容
elif [ 判断条件 ];then
执行内容
else
执行内容
fi其中
if :; then echo “always true”; fi
“:”是一个特殊的命令,称为空命令,该命令不做任何事,但 Exit Status 总是真。3.3 case/esac
每个匹配分支可以有若干条命令,末尾必须以;; 结束
echo “Is it morning? Please answer yes or no.”
read YES_OR_NO
case “$YES_OR_NO” in
yes|y|Yes|YES)
echo “Good Morning!”;;
[nN][Oo
echo “Good Afternoon!”;;
*)
echo "Sorry, $YESORNO not recognized. Enter yes or no
return 1;;
esac3.4. for/do/done循环
它类似于某些编程语言的 foreach 循环。
for FRUIT in apple banana pear; do
echo "I like $FRUI
done3.5 while/do/done
COUNTER=1
read passwd
while [ p a s s w d ! = " i t c a s e " − a " passwd != "itcase" -a " passwd!="itcase"−a"COUNTER" -lt 4 ]; do
echo “Here we go again”
COUNTER=$[COUNTER+1]
read passwd
done -
通配符
*匹配 0 个或多个任意字符
? 匹配一个任意
[若干字符] 匹配方括号中任意一个字符的一次
例:
ls *.sh
ls ???.sh
ls [a-z][0-9][0-9].sh (查找t34.sh) -
命令代换
由“`”反引号括起来的也是一条命令,Shell 先执行该命令,然后将输出结果立刻代换到当前命令行中。 例如:DATE=
date
echo $DATE命令代换也可以用$()表示:
$ DATE=$(date)VAR =$(date)
Echo $VAR -
算术代换
对变量执行算数运算:$((变量名))或 [ 变 量 名 ) ] i t c a s t [变量名)] itcast [变量名)]itcast VAR=45
itcast$ echo ( ( (( ((VAR+3)) 等价于 $((var+3)) 或 echo $[VAR+3]或 [ [ [VAR+3]
$[base#n],其中 base 表示进制,n 按照 base 进制解释,后面再有运算数,按十进制解释。
例 echo $[2#10+3]----5
echo $[8#10+3]----11
echo $[16#10+3]----19 -
转义字符
a. \b. –
因为各种 UNIX 命令都把-号开头的命令行参数当作命令的选项,而不会当作文件名。
创建为-hello的文件:
itcast$ touch – -hello
itcast$ touch ./-hello
删除为-hello的文件:
rm – -hello
c.续行符
在\后敲回车表示 -
单引号
括字符串 -
双引号
括字符串 可防止通配符扩展,但允许变量扩展。建议在测试变量取值时都加“”。
itcast$ VAR=200
itcast$ echo V A R 200 i t c a s t VAR 200 itcast VAR200itcast echo ‘$VAR’
V A R i t c a s t VAR itcast VARitcast echo “$VAR”
200 -
位置参数
$0 相当于 C 语言 main 函数的 argv[0]
$1、$2… 这些称为位置参数(Positional Parameter),相当于 C 语言 main 函数的 argv[1]、argv[2]…
$# 相当于 C 语言 main 函数的 argc - 1,注意这里的#后面不表示注释
$@ 表示参数列表"$1" “$2” …,例如可以用在 for 循环中的 in 后面。
$* 表示参数列表"$1" “$2” …,同上
$? 上一条命令的 Exit Status
$$ 当前进程号
Shift 左移命令参数 -
输入输出echo
显示文本行或变量,或者把字符串输入到文件。
echo [option] string
-e 解析转义字符
-n 不回车换行。默认情况 echo 回显的内容后面跟一个回车换行
echo “hello\n\n”
echo -e “hello\n\n”
echo “hello”
echo -n “hello” -
tee
tee 命令把结果输出到标准输出,另一个副本输出到相应文件。
tee -a a.txt 表示追加操做
df -k | awk ‘{print $1}’ | grep -v “文件系统” | tee -a a.txt -
函数
foo(){ echo “Function foo is called”;}
echo “-=start=-”
foo
echo “-=end=-”
注意函数体的左花括号 { 和后面的命令之间必须有空格或换行。如果将最后一条命令和右花括号 } 写在同一
行,命令末尾必须有分号;。 -
脚本调试方法
n 读一遍脚本中的命令但不执行,用于检查脚本中的语法错误。
-v 一边执行脚本,一边将执行过的脚本命令打印到标准错误输出。
-x 提供跟踪执行信息,将执行的每一条命令和结果依次打印出来。 -
正则表达式
1.字符类
2.数量限定符
3.位置限定符 -
Sed
sed 命令行的基本格式为:
sed option ‘script’ file1 file2 … sed 参数 ‘脚本(/pattern/action)’ 待处理文件
sed option -f scriptfile file1 file2 … sed 参数 –f ‘脚本文件’ 待处理文件
如:
sed “s/the/this/” testfile 将源文件内容每行第一个the替换为this。(输出到标准输出缓冲区中,输出后看到的内容是改变后的,但原文件本身内容并没有被修改。)(将当前文件读出来放缓冲区中,然后在缓冲区中做替换操作)
sed -i “s/the/this/g” testfile 将源文件内容中全部the替换为this (g),原文件本身内容也将会被修改(-i)。
sed “s/the/this/g” testfile | tee t111 把结果输出到标准输出,同时生成一个副本t111。
sed -i “2a itcast” testfile 在输出 testfile 内容的第二行后添加"itcast"。
sed -i “3d” testfile 删除第三行