初识shell
什么是shell?
Shell是介于系统内核和用户之间的解释程序;
什么是脚本?
用特定的解释性语言,写作的可执行的文件
创建shell脚本
1)明确任务
2)整理执行语句
3)完善脚本的结构:开头,注释,执行过程信息
执行shell脚本
1)chmod +x 脚本, 然后./test.sh执行脚本
2)sh 脚本, 执行脚本 ——指定脚本解释器
3)source 脚本, 执行脚本 ——用系统默认的脚本解释器
shell命令的组合运用
管道
前一条命令的输出作为后一条命令的输入,从左到右, 单向; 例如:
ps aux | gerp http
重定向
标准输入:<,改变输入的方式,输入不再是console,可以是文件或其他
标注输出:>,>>;分别是覆盖和追加。
错误输出:2>,2>>;分别是覆盖和追加。
全部输出:&>,&>>;包括标准和错误输出,分别是覆盖和追加。
命令分隔
&&: 两条命令都要执行成功,只要有一条执行失败,就失败
||: 两条命令执行一条就可以
;: 分号,简单命令的连续执行
使用变量
变量的定义和赋值、引用
例如: x=2; echo $x;或者${x}
单引号、双引号、反撇号
单引号:禁止引用、转义\;例如:x=2;echo ‘$x’,结果就是$x
双引号:可以引用、转义;例如: x=2;echo “$x”,结果就是2
反撇号:用命令的输出替换;例如x=`uname -r`; echo “$x”, 结果就是uname执行结果:3.7.10-1.1-default
注:用命令的输出替换,也可以直接用$()来使用,例如:$(uname -r)
常用的环境变量
系统赋值:USER, HOME,SHELL
用户操作:PATH,LANG
其他的特殊变量
$?:前一条命令执行的结果,cattest.c; echo $?;0标示前一条命令执行成功,非0表示失败;
$0:脚本自身的名字,脚本的名字变了,这个变量也会变化;
$1-$9:第1—第9个位置参数
$*:所有的位置参数
$#:位置参数的个数
数值运算及处理
整数运算操作
+,-,*,/,%
1. expr : expr 1 – 2,
2. $[]: echo $[1 -2]
几个数值的处理技巧
变量的递更处理:x=2;let x++; echo $x;x=2;let x--; echo $x; x=2;let x+=5; echo$x
使用随机数:echo $RANDOM(0-32767); echo $[RANDOM%100]
生产数字序列:seq 首数末数、 seq 首数 增量 末数
seq 3: 1 2 3
seq 2 5:2 3 4 5
seq 3 2 10: 3 5 7 9
小数运算操作
bc命令:echo “5.5 -4.3” |bc
限制小数的位数: echo “scale=4; 10/3” | bc
字符串处理
字串截取操作
路径分割:
dir=/etc/net/ll.txt
dirname $dir:/etc/net
basename $dir:ll.txt
expr: expr substr 变量 起始位置 截取长度, 起始为1
var=yunjingguang
expr substr $var 3 3:nji
expr substr $var 1 3:yun
${变量:起始位置:截取长度}:起始为0
var=yunjingguang
echo ${var:3:3}:jin
echo ${var::3}:yun
字符串替换
${}:
${var/old/new}:变量var的第一个old替换成new
${var//old/new}:变量var的所有olde替换成new
例如:
var=yunjingguang
echo ${var/u/##}:y##njingguang
echo ${var//u/##}:y##njingg##ang
使用随机字符串
随机设备:/dev/urandom; head -1 /dev/urandom
md5转换:head -1 /dev/urandom | md5sum
字符串的切割:echo “$var” | cut –b 起始位置-结束位置
注:当从开始切割时,起始位置可以省略,结束位置为末尾时,结束位置可以省略; -8和 9-。
例如:head -1 /dev/urandom | md5sum | cut –b 1-5
/dev/urandom 产生的第一行数据经过md5运算, 运算结果截取第1个到第5个
条件测试
测试操作规范
根据$?来判断条件是否成立; /home/y_jg 是否是一个目录:
test 条件表达式:test –d “/home/y_jg” && echo YES
[ 条件表达式 ]: [ -d “/home/y_jg”] && echo YES
条件不成立:[ !-d “/home/y_jg”] && echo YES
文件状态的检测
存在及识别
-e:是否存在(Exit)
-d:是否是目录(Directory), 先检测是否存在
-f:是否是文件(File),先检测是否存在
权限的检测
-r:是否有读取的权限
-w:是否有写入的权限(文件不可写时, 但是文件的所有者还是可以写入)
-x:是否有可执行的权限
整数值比较
-eq:等于(Equal)
-ne:不等于(No Equal)
-gt:大于(Greater Than)
-lt:小于(Lesser Than)
-ge:大于或等于(Greater orEqual)
-le:小于或等于(Lesser orEqual)
例如:
[ $(who | wc -l) -eq 2] && echo YES
字符串匹配
=:两个字符串相同
!=:两个字符串不同
[ $USER = “y_jg” ] && echo YES
[ $USER != “zhangsan” ] && echo YES
使用if判断结构
单分支if语句结构
If 条件测试
then 命令序列
fi
双分支if语句结构
If 条件测试
then 命令序列
else 命令序列
fi
多重分支的if应用
If 条件测试
then 命令序列
elif
then 命令序列
else 命令序列
fi
使用for循环
for语句结构
for 变量 in 取值列表
do
命令序列
done
取出所有“取值列表” 中的值进行处理,当取到最后一个值后就退出。
退出方法:break, continue, exit[n]
使用case分支
基本用法规范
case 变量 in
模式1)
命令序列
;;
模式2)
命令序列
;;
模式3)
命令序列
;;
*)
默认的命令序列
;;
esac