shell脚本

一 什么是shell script

将OS命令堆积到可执行的文件里,由上至下的顺序执行文本里的OS命令,再加上些智能(条件/流控)控制,就变成了智能化脚本了。

二 变量

part1 为何要有变量

程序的运行就是一些列状态的变量->用变量值的变化去表示

 

part2 变量命名规则

以字母或下划线开头,剩下的部分可以是:字母、数字、下划线.

最好遵循下述规范:

1.以字母开头

2.使用中划线或者下划线做单词的连接

3.同类型的用数字区分

4.对于文件最好加上拓展名 例如: sql_bak.tar.gz,log_bak.tar.bz2

 

part3 系统变量

set  显示所有变量

env  环境变量

 

part4 变量赋值

varname=value

echo $varname

删除变量 unset varname

part5 常用系统变量

PATH

PWD  ccho $PWD查看位置

LANG

HOME

HISTSIZE    echo $HISTSIZE    查看限制保存历史记录的条数

      vim /etc/profile 修改保存限制保存历史记录的条数 

      HISTSIZE = 800

PS1   定义linux界面命令行每行前面的格式

IFS

域分隔符 是空格,换行,TAB键的合集

part6 全局变量与局部变量

  export money=1000  定义一个全局变量

  爹子辈的全局变量子字辈可以用

  子字辈的全局变量爹字辈不能用

part7 定义变量名的边界

[root@MiWiFi-R3-srv ~]# rest_mem=20

[root@MiWiFi-R3-srv ~]# echo ${rest_mem}%

20%

part 8 数据类型

bash中的变量无须声明,拿来就用.默认的变量都会是字符类型,还可以有数字类型,普通的脚本,这两种类型够用了

运算符

part1 算术运算符

    +

-

*

/

%

$[ ]进行数学运算

part2 关系操作

<

>

<=

>=

==

!=

&&

||

[  ] 在括号内进行关系比较,要用-gt大于,-ge 大于等于,-eq等于,-le小于等于,-lt小于,-ne不等于,同test

-gt is greater than,
-ge is greater than or equal to,
-eq is equal to,
-le is less than or equal to,
-lt is less than,
-ne is not equal to

  !取反,-a和,-o或  

(())在括号内进行关系比较,要用<,>,<=,>=

part3 赋值运算符

=

+=

*=

/=

%=

part4 shell里的所有计算器
  $[]       y=$[$x+1]  echo y

  (())    ((y=x+1))  echo y

  $(())   echo  $((y=x+1))   直接将计算结果输出

  expr    expr $x +$y  直接输出结果

浮点运算

  先装bc包  yum install bc -y

  echo   "scale=2;30/1000"  | bc -l  保存两位小数

part5 测试操作

  命令执行后会返回到一个系统变量中 $?
  如果$?值为0 表示命令执行成功 否则为失败

  part5-1、测试文件状态

  -d  文件存在,是一个目录  test -d /etc

  -s  文件存在,还是一个非空文件

  -e  文件存在

  -f  文件存在,是一个普通文件

  -h或者L  文件存在,是一个链接文件

  -w  文件存在,当前用户有写权限

  -r 文件存在,当前用户有读权限

  -x 文件存在,当前用户有执行权限

  part5-2、字符串测试
  =   两个字符串相等
  !=  两个字符串不相等
  -z  空串
  -n  非空串

  part5-3、测试数值
  -eq 等于
  -ne 不等于
  -gt 大于
  -lt 小于
  -ge 大于等于
  -le 小于等于

四 流程控制

part1分支结构

if  [条件]

  then

elif  [条件]

  then

else  [条件]

  then

fi

#!/bin/bash
#指定解释器
var='/etc/init.d'
if [ -d $var ]
    then
        echo "$var is directory"
elif [ -b $var ]
    then
        echo "$var is block"
elif [ -f $var ]
    then
        echo "$var is regular file"
else
        echo 'unknow'
fi

写完脚本,给执行权限chmod +x

./ 脚本文件   执行脚本

 

向脚本传递参数

#test.sh
echo $0
#取文件名
echo $
1 echo $2 echo $3 echo ${11} #传递参数的第十一个参数 echo '$$' $$ #脚本运行的ID号
echo
'$*' $* echo '$@' $@ echo '$#' $#
#总共有多少个参数 echo
'$?' $? ''' 测试:python test.sh 1 2 3 4 5 6 7 8 9 10 11 输出结果: ./test.sh 1 2 3 11 $$ 14312 $* 1 2 3 4 5 6 7 8 9 10 11 $@ 1 2 3 4 5 6 7 8 9 10 11 $# 11 $? 0 '''

在文本中命令行模式,%s /aaa/bbb/g   #将文件中的aaa全部改为bbb

将脚本拷贝到/usr/bin下,在任何位置直接脚本名就可以运行,如果要固化,就要在/etc/profile内改路径

ps aux |grep nginx |grep -v 'grep'     过滤nginx,然后把本身的grep命令产生的nginx过滤掉

part2 循环结构

part2-1 while循环

while (条件)

do

  动作

done

需要无限循环时我们会选择while :

#!/bin/bash
var1=AAA
var2=BBB
var3=CCC
while :
do
    clear
    echo -e "A:${var1}
B:${var2}
C:${var3}"
#-e 将
换行输出
    temp=$var1
    var1=$var2
    var2=$var3
    var3=$temp
    sleep 1
done

part2-2 for循环 

ping -c1 192.168.16.188   ping一次这个IP地址

ping -c1 192.168.16.188 &> /dec/null   ping后的显示结果扔进黑洞文件

检查内网存活的IP
    #!/bin/bash

    for i in {1..254}
    doping -c1 192.168.16.$i &> /dev/null
       if [ $? -ne 0 ]
       then
        echo "192.168.16.$i is available"
         else
          echo "192.168.16.$i is unavailable" &> /dev/null    done

part2-3 case语句

case $uname in
 root)
#判断uname是否匹配root
echo "welcome $uname" ;; #执行结束
seker)
echo "welcome $uname" ;; default) echo "welcome $uname" ;; *) #全部没匹配成功
echo "no user $uname" esac

函数

交互shell中的函数

function abc(){

    echo 'aaa';

    echo 'bbbb'; 

}

 abc #调用

 脚本中的函数

1.函数定义

shell允许将一组命令集或语句形成一个可用块,这些块称为shell函数    

定义函数的格式:

function-name (){        

command1        

........    

}

或 function function-name(){ #函数名前面多了个function关键字

command1        

........    

}

2.函数调用    

以下是一个函数的脚本实例:

#!/bin/bash    

#hello    

function hello(){       #声明函数

echo "Hello!"     #函数的主体,输出"Hello!"  

}  #函数结束

hello #调用函数  

3.参数传递  

向函数传递参数就像在脚本是使用变量位置$1,$2,$3...$9

以下是一个传递参数的实例:

#!/bin/bash  

#hellofun  

function hello(){      

echo "Hello! The first parameter is '$1'."  

}  

hello good  

#该脚本执行的结果是: Hello! The first parameter is 'good'.

4.函数文件  

保存函数的文件,用以上的例子写成一个函数文件如下:

#!/bin/bash  

#hellofunction  

function hello(){    

echo "Hello!"    

return 1  

}

上面的hellofunction文件就是一个函数文件,可通过另一个脚本来调用

#!/bin/bash  

#hellof  

. hellofunction#注意点和hellofunction之间有个空格

hello

5.载入和删除  

用set查看已载入的函数  

用unset function-name 取消载入  

举例如下:

#!/bin/bash  

#hellof  

. hellofunction  

unset hello  

hello   #因为已经取消载入。。所以会出错

6.函数返回状态

#!/bin/bash  

#hellofun  

function hello(){    

echo "Hello! The first parameter is '$1'."    

return 1  

}  

hello  

echo $?#输出返回的状态值(一般成功是返回0,其它值为失败) 

原文地址:https://www.cnblogs.com/domestique/p/6747007.html