【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

 

posted @ 2018-02-24 14:37  小火星_Hirsi  阅读(269)  评论(0编辑  收藏  举报