心得:shell脚本可读性非常差,编写完之后应该有相应的注释,是否之后修改起来会非常麻烦。
#set 查看bash中变量
#unset VARNAME 撤销变量
#bash -n 脚本.sh 实现测试文件语法是否有错误
#bash -x 脚本.sh 显示整个脚本过程
1、循环
for循环,适用于循环次数已知的场景。
while循环:适用于循环次数未知的场景。
--------------------------------------------------
循环:while、for、until
--------------------------------------------------
whi CONDITION; do
statment;
done
条件满足、进入循环。条件不满足、退出循环。
--------------------------------------------------
until CONDITION; do
statment
done
条件满足、退出循环。条件不满足、进入循环
--------------------------------------------------
break:提前退出循环
continue:提前结束本轮循环,而进入下一轮循环
--------------------------------------------------
for 变量 in 列表; do
循环体
done
--------------------------------------------------
for ((expr1;expr2;expr3)); do
循环体
done
--------------------------------------------------
如何生产列表:
{1..100}
seq 起始数 步进长度 结束数 #seq 1 2 10
for I in `seq 1 $1`;do done
--------------------------------------------------
双分支if语句
if 判断条件;then
statement1
statement2
else
statem ent3
fi
--------------------------------------------------
多分支的if语句:
if 判断条件1; then
statement1
elif 判断条件2; then
statemnet2
elif 判断条件3;then
statemnet3
fi
--------------------------------------------------
case $1 in
1)
statement1;;
2)
statement2;;
*)
statement3;;
esac
--------------------------------------------------
2、条件判断:
条件测试的表达式:
[ expression ]
[ [expression] ]
test expression
整数比较:
-eq:测试两个整数是否相等; 比如 [ $A -eq $B ]
-ne:测试两个整数是否不等;不等,为真,相等,为假。
-gt:测试一个数是否大于另一个数,大于,为真;否则为假;
-lt:测试一个数是否小于另 一个数,小于,为真,否则为假;
-ge:大于或等于
-le:小于或等于
字符测试:
==: 测试是否相等,相等为真,不等为假
!=:测试是否不等,不等为真,相等为假
>
<
-n:测试制定字符串是否为空,空则真,不空则假。 null
文件测试:
-e FILE: 测试文件是否存在 exist
-f FILE:测试文件是否为普通文件 file
-d FILE:测试指定路径是否为目录 directory
-r FILE:测试当前用户对指定文件是否由读取权限。 read
-w FILE: write
-x FILE: eXecute
-z FILE:测试参数是否为空 zero
3、变量名称:
1、只能包含字母,数字和下划线,并且不能数字开头;
2、不应该跟系统中已有的环境变量重名;
3、最好做到见名知义。
命令之间逻辑关系;
逻辑与: &&
逻辑或: | |
组合测试条件
-a:与关系 =&
-o:或关系 =|
!:非关系
if [ $# -gt 1 -a $# -le 3 ] 大于1且小于3
if [ $# -gt 1 ] && [ $# -le 3 ] 大于1且小于3
4、数量计算:
shell中如何进行算术运算;
A=3 B=6
1、let 算术运算表达式 #let C=$A+$B
2、 $[算术运算表达式] #C=$[$A+$B]
3、$((算术运算表达式)) #C=$(($A+$B))
4、SUM_MONEY=$(awk "BEGIN{print $SUM_TIME*$MONEY}") 计算带浮点型
生产随机数
RANDOM: 0-32768
随机数生产器:滳池
/dev/random:
/dev/urandom:
5、特殊变量:
定义脚本退出状态码:
exit:退出脚本。
exit #
base变量的类型:
本地变量(局部变量)
环境变量
位置变量 $1..$2..$3
./biaoben.sh /etc/fatab /etc/inittab
$1 = /etc/fatab
$2 = /etc/inttab
shift n 轮换
./biaoben.sh /etc/fatab /etc/inittab
$0 当前脚本的文件名
$? 显示上一命令的执行状态码
$# 显示参数的个数
$* 显示所有参数列表
$@ 显示所有参数列表,与上不太相同,有更高级用途,被双引号(" ")包含时,与 $* 稍有不同,下面将会讲到。
$$ 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。
6、程序执行结果
程序执行:可能由两类返回值。
程序状态返回代码(0~255)
0:正确执行
1~255:错误执行, 1,2.127系统预留。
/dev/null 软件设备:bit bucket 数据黑洞
/dev/zero 数据生产 0000
sleep 1 默认单位为秒
sleep 1m 表示延迟一分钟 、1h 表示延迟一小时、1d 表示延迟一天
7、函数:
实现:代码重用;结构化编程,不能独立允许,需要调用时执行,可以被多次调用;
定义一个函数:
FUNCNAME()
{
command
}
调用函数
FUNCNAME $1 $2
提前结束本次函数
return
自定义执行状态返回值:
return #
0-255
接受参数的函数:
./a.sh m n $1:m $2:n
8、bash 特性:
FILE=/usr/local/src(此处的FILE这任意一个变量)
${FILE#*/}:usr/local/src
${FILE##*/}:src
${FILE%/*}:/usr/local 截取某文件目录
${FILE%%/*}:
/ 指分隔符,可为任意符号
# 表示至左往右找第一个分隔符,匹配到后,至右往左删除后面的字符
## 表示至左往右找最后一个分隔符,匹配到后,至右往左删除后面的字符
% 表示至右往左找第一个分隔符,匹配到后,至左往右删除后面的字符
%% 表示至右往左找最后一个分隔符,匹配到后,至左往右删除后面的字符
9、环境变量:
export 命令用于将shell变量输出为环境变量,或者将shell函数输出为环境变量。
增加原变量中的参数:#PATH=$PATH:/usr/local/mysql/bin:
查看当前shell中的环境变量:printenv、env、export
撤销变量:unset VARNAME
查看当shell中变量::set
10、特殊用法:
[ $A -eq 1 ] && echo "holle you." #如果A=1则显示holle you,否则不执行。
for I in `seq 1 $#`;do 循环N个参数次。 如有3个参数则循环3次。
while的特殊用法一、(死循环)
while :; do
......
done
while的特殊用法二、(逐行读取)
while read LINE;do
.......
done < /PATH/TO/SOMEFILE
(输入重定向,读取文件的路径)
11、read命令:与用户进行交互
-p 允许在read命令行中直接指定一个提示
-t # 计时器#默认单位为秒,如在指定时间不输入的话,read命令返回非零值
指定的变量将为空。
-n# 设置输入的字符,变量只接受指定的#个字符。
-s 隐藏输入的值,多用于输入密码时使用。实际将输入的文件颜色设置成与背景相同
cat /tmp/test.txt |while read line;将test.txt文本中的内容每行的保存到line变量中。
awk
#df -Ph | awk '{print $1,$3}'
#fdisk -l 2> /dev/null | grep "^Disk /de[sh]d[a-z]" | awk -F: '{print $1}'
字体显示控制:
echo -e \033[3;37;41m显示内容\033[0m
其中-e 表示使用扩展属性
\033[3;37;41m 表示按此格式显示“显示内容”
\033[0m 表示特殊格式结束,后面的内容正常显示。
3 表示字体格式(宋体、加粗、下划线、闪动)
37 表示字体颜色(1-7 七种颜色)
41 表示字体底色(1-7 七种颜色)
12、其他
1、变量中字符的长度:${#VARNAME}
2、变量赋值等:
${parameter:-word}:如果parameter为空或未定义,则变量展开为“word”;否则,展开为parameter的值;
${parameter:+word}:如果parameter为空或未定义,不做任何操作;否则,则展开为“word”值;
${parameter:=word}:如果parameter为空或未定义,则变量展开为“word”,并将展开后的值赋值给parameter;
${parameter:offset}
${parameter:offset:length}:取子串,从offset处的后一个字符开始,取lenth长的子串;
3、脚本配置文件
/etc/rc.d/init.d/服务脚本
服务脚本支持配置文件:/etc/sysconfig/服务脚本同名的配置文件
4、局部变量
local VAR_NAME=
a=1
test() {
a=$[3+4]
}
test
for I in `seq $a 10`; do
echo $I
done
5、命令mktemp
创建临时文件或目录
mktemp /tmp/file.XX
-d: 创建为目录
6、信号
kill -SIGNAL PID
1: HUP
2: INT
9: KILL
15: TERM
脚本中,能实现信号捕捉,但9和15无法捕捉
Ctrl+c: SIGINT
trap命令:
trap 'COMMAND' 信号列表
7、一行执行多个语句,语句间用分号分隔
常用:
获取当前时间搓 date +%s
将时间戳转为为标准时间 date -d @123123123