Linux5.7 Shell基础下

shell脚本介绍

  脚本语音,可以使用逻辑判断、循环等语法,自定义函数,是系统命令的集合,可以实现自动化运维,能大大增加我们的运维效率。

shell脚本结构和执行

  开头需要加#!/bin/bash  。意味着下面的语句由bash解析          

  以#开头的行作为解释说明

  脚本的名字以.sh结尾,用于区分这是一个shell脚本

  执行方法有两种
       chmod +x 1.sh; ./1.sh
       bash 1.sh
     查看脚本执行过程 bash -x 1.sh

  查看脚本是否语法错误 bash -n 1.sh     无输出,则无语法错误

date命令用法

[root@chy002 ~]# date
2018年 02月 10日 星期六 04:53:59 CST

  年的两种表示

[root@chy002 ~]# date +%Y
2018
[root@chy002 ~]# date +%y
18

  月份的表示,大写%M表示分钟

[root@chy002 ~]# date +%m
02

  日期的表示

[root@chy002 ~]# date +%d
10

  年月日,%D表示

[root@chy002 ~]# date +%D
02/10/18

  组合表示年月日

[root@chy002 ~]# date +%Y%m%d
20180210
[root@chy002 ~]# date +%Y:%m:%d
2018:02:10
[root@chy002 ~]# date +%Y-%m-%d
2018-02-10
[root@chy002 ~]# date +%Y/%m/%d
2018/02/10
[root@chy002 ~]# date +%F
2018-02-10

  小时,分钟,秒的表示

[root@chy002 ~]# date +%T
05:14:22
[root@chy002 ~]# date +%H
05
[root@chy002 ~]# date +%M
14
[root@chy002 ~]# date +%S
31

  周的表示

[root@chy002 ~]# date +%w      #表示今天周几
6
[root@chy002 ~]# date +%W     #表示今年第多少周
06

  时间戳的表示,距离1970年1月1日0点0分0秒有多少秒

[root@chy002 ~]# date +%s
1518211370

[root@chy002 ~]# date -d @1518211370
2018年 02月 10日 星期六 05:22:50 CST

[root@chy002 ~]# date +%s -d "2017-02-10 05:22:50"
1486675370

  -d表示之前或者之后的日期

[root@chy002 ~]# date
2018年 02月 10日 星期六 05:33:11 CST
[root@chy002 ~]# date -d "-1 month" +%F
2018-01-10
[root@chy002 ~]# date -d "-1 year" +%F
2017-02-10
[root@chy002 ~]# date -d "-2 day" +%F
2018-02-08
[root@chy002 ~]# date -d "+2 week" +%F
2018-02-24
[root@chy002 ~]# date -d "+2 hour" +%T
07:33:04

shell脚本中的变量

当脚本中使用某个字符串较频繁并且字符串长度很长时就应该使用变量代替
使用条件语句时,常使用变量    if [ $a -gt 1 ]; then ... ; fi
引用某个命令的结果时,用变量替代   n=`wc -l 1.txt`
写和用户交互的脚本时,变量也是必不可少的  read -p "Input a number: " n; echo $n  如果没写这个n,可以直接使用$REPLY
内置变量 $0, $1, $2…    $0表示脚本本身,$1 第一个参数,$2 第二个 ....       $#表示参数个数
数学运算a=1;b=2; c=$(($a+$b))或者$[$a+$b]

shell脚本中的逻辑判断

格式1:if 条件 ; then 语句; fi

#!/bin/bash
a=5
if [ $a -gt 3 ]
then
        echo ok
fi

格式2:if 条件; then 语句; else 语句; fi

#!/bin/bash
a=1
if [ $a -gt 3 ]
then
        echo ok
else
        echo no ok
fi

格式3:if …; then … ;elif …; then …; else …; fi

#!/bin/bash
a=5
if [ $a -lt 4 ]
then
        echo "<4"
elif [ $a -lt 6 ]
then
        echo "<6 $$ >4"
else
        echo no ok
fi

逻辑判断表达式:if [ $a -gt $b ]; if [ $a -lt 5 ]; if [ $b -eq 10 ]等

-gt (>); -lt(<); -ge(>=); -le(<=);-eq(==); -ne(!=) 注意条件语句到处都是空格

可以使用 && || 结合多个条件

if [ $a -gt 5 ] && [ &a - lt 10 ]; then

if [ $b -gt 5 ] || [ $b -lt 3 ]; then

文件目录属性判断

[ -f file ]判断是否是普通文件,且存在
[ -d file ] 判断是否是目录,且存在
[ -e file ] 判断文件或目录是否存在
[ -r file ] 判断文件是否可读
[ -w file ] 判断文件是否可写
[ -x file ] 判断文件是否可执行

判断普通文件

#!/bin/bash
file="/tmp/1.txt"
if [ -f $file ]
then
        echo $file exist
else
        touch $file
fi

逻辑判断简写

file="/tmp/1.txt"
[ -f $file ] && rm -f $file
等同于
if [ -f $file ]
then
        rm -f $f
fi


[ -f $file ] || touch $file
等同于
if [ ! -f $file]
then
        touch $file
fi

if特殊用法

if [ -z "$a" ]  这个表示当变量a的值为空时会怎么样
if [ -n "$a" ] 表示当变量a的值不为空
if grep -q '123' 1.txt; then  表示如果1.txt中含有'123'的行时会怎么样
if [ ! -e file ]; then 表示文件不存在时会怎么样
if (($a<1)); then …等同于 if [ $a -lt 1 ]; then…
[ ] 中不能使用<,>,==,!=,>=,<=这样的符号

是否文件中存在目标的行,但是不输出过滤的该行

#!/bin/bash
if  grep -q 'file' file.sh
then
        echo you
fi

 case判断

基本格式

case  变量名  in
    value1)
        command
        ;;
    value2)
        command
        ;;
    *)
        command
        ;;
    esac

#在case程序中,可以在条件中使用 |  ,表示或的意思,比如 
    2|3)
        command
        ;;

for循环

语法:for 变量名 in 条件; do …; done

for  i  in `seq 1 3` == for i in '123'

for循环以空格或者回车作为分隔符

#!/bin/bash
sum=0
for i in `seq 1 100`
do
    sum=$[$sum+$i]
    echo $i
done
echo $sum


//文件列表循环
#!/bin/bash
cd /etc/
for a in `ls /etc/`
do
    if [ -d $a ]
    then
       ls -d $a
    fi
done

while循环

   注:条件为冒号:时,永为真。等于ture

语法 while 条件; do … ; done

案例1
#!/bin/bash
while :
do
    load=`w|head -1|awk -F 'load average: ' '{print $2}'|cut -d. -f1`
    if [ $load -gt 10 ]
    then
        top|mail -s "load is high: $load" asldkfls@11.com
    fi
    sleep 30
done


#!/bin/bash
while :
do
    read -p "Please input a number: " n
    if [ -z "$n" ]
    then
        echo "you need input sth."
        continue
    fi
    n1=`echo $n|sed 's/[0-9]//g'`
    if [ -n "$n1" ]
    then
        echo "you just only input numbers."
        continue
    fi
    break
done
echo $n

Shell中断退出

  break直接结束本层循环

#!/bin/bash
for i in `seq 1 5`
do
    echo $i
    if [ $i == 3 ]
    then
        break
    fi
    echo $i
done
echo aaaaaaa

  continue忽略其之下的代码,直接进行下一次循环

#!/bin/bash
for i in `seq 1 5`
do
    echo $i
    if [ $i == 3 ]
    then
        continue
    fi
    echo $i
done
echo $i

  exit直接退出shell

#!/bin/bash
for i in `seq 1 5`
do
    echo $i
    if [ $i == 3 ]
    then
        exit
    fi
    echo $i
done
echo aaaaaaa

Shell函数

函数就是把一段代码整理到了一个小单元中,并给这个小单元起一个名字,当用到这段代码时直接调用这个小单元的名字即可。

格式: 
function f_name() 
{                 
    command             
}
函数必须要放在最前面


示例1 
#!/bin/bash
input() {
    echo $1 $2 $# $0
}

input 1 a b


示例2 
#!/bin/bash
sum() {
    s=$[$1+$2]
    echo $s
}
sum 1 2

示例3 
#!/bin/bash
ip() {
    ifconfig |grep -A1 "$1 " |tail -1 |awk '{print $2}'|awk -F':' '{print $2}'
}
read -p "Please input the eth name: " e
myip=`ip $e`
echo "$e address is $myip"

数组

定义数组 a=(1 2 3 4 5); echo ${a[@]}
 echo ${#a[@]} 获取数组的元素个数 
 echo ${a[2]} 读取第三个元素,数组从0开始
 echo ${a[*]} 等同于 ${a[@]}  显示整个数组
 数组赋值
 a[1]=100; echo ${a[@]}
 a[5]=2; echo ${a[@]} 如果下标不存在则会自动添加一个元素
 数组的删除
 uset a; unset a[1]

 数组分片
 a=(`seq 1 5`)
 echo ${a[@]:0:3} 从第一个元素开始,截取3个
 echo ${a[@]:1:4} 从第二个元素开始,截取4个
 echo ${a[@]:0-3:2} 从倒数第3个元素开始,截取2个
 数组替换
 echo ${a[@]/3/100}
 a=(${a[@]/3/100}) 把第三个数改100

 

原文地址:https://www.cnblogs.com/chyuanliu/p/8433432.html