【linux之shell脚本】
一、简介
机器语言
汇编语言
高级语言
面向过程 C Shell Perl
面向对象 java python c++
强语言:先编译再执行 java c++
弱语言:边编译边执行 shell python php
魔数(magic number)
shebang 程序入口 必须放在第一行
#!/bin/bash
#
echo "hello,world."
写完一个脚本,如何执行获得结果?
①bash Script-file
②source Script-file = . Sicript-filecript-file
③chmod +x Script-file; ./Script-file
bash -x 看脚本执行的过程
二、变量
1、定义:
变量名=变量值
在内存中申请一个空间,取名叫“变量名”;然后将变量值存入该内存空间
一般情况下,一个变量只能存储一个变量值
2、分类
根据使用的范围,可以分为:
环境变量:能够在当前shell及其子shell中生效的变量
本地变量:只能在当前shell中生效的变量
局部变量:只能在当前的程序段中生效的变量
位置变量:$0, $1, $2, ...
特殊变量:$?, $$, $*, ...
定义环境变量:
1.export 变量名=变量值
2.declare -x 变量名=变量值
3.变量名=变量值 export 变量名
定义本地变量:
变量名=变量值
定义局部变量:
local 变量名=变量值
4、获得变量值的方法
echo ${变量名}
ANIMAL=pig
there are 3 ${ANIMAL}s
3、变量名的命名规则
1.只能是字母或下划线开头,并且整个名字只能包括字母、数字、下划线
2.变量名严格区分大小写
3.新设置的变量名不要跟已经存在并生效的变量名重复
4.定义新的变量名的时候,最好做到见名知义
4、位置变量
$1,$2,$3,...
shift
与位置有关的几个特殊变量
$#:参数总数
$*,$@:列表显示所有参数
三、测试语句test
-
条件测试语句
test Condition
[ Condition ]
[[ Condition ]]
-
整数测试
-eq:等于
-ge:大于等于
-gt:大于
-le:小于等于
-lt:小于
-ne:不等于
-
字符串测试
-n 不为空
-z 为空
=、==:字符串的内容是否相同
!=:字符串的内容是否不同
[ $A != $B ]
-
文件状态测试
-d:测试指定的文件是否为目录
-e:测试指定的文件是否存在
-f:测试指定的文件是否为普通文件
-r:测试指定的文件对于当前用户是否有读权限
-w:测试指定的文件对于当前用户是否有写权限
-x:测试指定的文件对于当前用户是否有执行权限
四、算术运算
shell中的算术运算 + - * / %(模运算)
A=2
B=3
1.let C=$A+$B echo $C 2.C=$[$A+$B] C=$[$A**$B] 2的三次方 3.C=$(($A+$B)) 4.C=`expr $A + $B`
自身加一
let A++
let A+=1
四、脚本的控制结构
顺序结构:shell脚本执行的默认结构
分支机构:也叫条件选择结构,只有符合条件的命令才会被执行
循环结构:在符合条件的情况下重复执行某些命令
-
if条件分支结构
1.单分支结构(只处理条件为真的时候的命令语句)
if condition;
then
statement1
......
fi
2.双分支结构(不管条件为真为假,都有命令要被处理)
if condition;then
statement1
......
else
statement1
fi
3.多分支结构
if condition;then
statement1
......
elif condition2;then
statement2
......
else
statement1
fi
exit #
在执行脚本的过程中遇到exit命令,不再执行后面的其他命令,直接推出脚本。在退出脚本之后,返回执行状态返回值为#。0~127(3~126 )
-
循环结构
1.for循环:
for 变量名 in 变量值列表;do
循环体(一组重复执行的语句)
done
-
变量值列表
1.一组整数: ①{1..100} 从1到100 ②seq 1 100 从1到100 ③seq 1 2 10 # 1 3 5 7 9 2.`cut -d: -f 1 /etc/passwd SUM=0 for I in {1..100};do let SUM+=$I done echo #SUM for ((I=1;I<100;I+=1));do
-
case
case 变量值 in Condition1) statment1 ... ;; Condition2) statment2 ... ;; ConditionN|ConditionN+1) statmentN ... ;; *) statment ... ;; esac
显示用户信息,printuser root 1 vim printuser #!/bin/bash # case $2 in 1) echo `grep "^$1\>" /etc/passwd | cut -d: -f$2` ;; 2) echo `grep "^$1\>" /etc/passwd | cut -d: -f$2` ;; 3) echo `grep "^$1\>" /etc/passwd | cut -d: -f$2` ;; 4) echo `grep "^$1\>" /etc/passwd | cut -d: -f$2` ;; 5) echo `grep "^$1\>" /etc/passwd | cut -d: -f$2` ;; 6) echo `grep "^$1\>" /etc/passwd | cut -d: -f$2` ;; 7) echo `grep "^$1\>" /etc/passwd | cut -d: -f$2` ;; *) echo "Usage: `basename $0` Username {1-7}" ;; esac
服务启动脚本 service.sh {start|stop|restart|status} vim service.sh #!/bin/bash # case $1 in start) echo "starting service ..." ;; stop) echo "stopping service ..." ;; restart) echo "Before starting, we must stop it." ;; status) echo "service is running ..." ;; *) echo "`basename $0` {start|stop|restart|status}" ;; esac
循环
while CONDITION;do 如果条件为真就执行循环体 当 循环体 done 当CONDITION为真的时候,执行循环体中的语句,否则退出循环 until CONDITION;do 直到 循环体 done 当CONDITION为假的时候,执行循环体中的语句,否则退出循环 死循环 while : ;do 循环体 done 循环嵌套 continue 立刻结束本次循环,进入下一次循环 break 循环体的执行会强行中断,退出循环,继续执行脚本其他命令 [ $SUM -gt 10000 ] && break I=0 while read LINE;do USERID=`echo $LINE | cut -d : -f 3` [ $UERID -lt 50 -a $USERID -gt 100 ] && continue echo $LINE && let I++ [ $I -eq 6 ] && break done < /etc/passwd I=0 USERLIST=`sort -n -t ":" -k 3 /etc/passwd for j in $USERLIST;do USERID=`echo $j | cut -d : -f 3` [ $UERID -lt 50 -a $USERID -gt 100 ] && continue echo $j && let I++ [ $I -eq 6 ] && exit 0 done