shell脚本小结

心得: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

你可能感兴趣的:(shell脚本小结)