Linux初学(十)shell脚本

一、for循环

1.1 循环的格式

for 变量 in 列表
do
    代码
    代码
    ....
done

循环的逻辑:

  • 将列表中的每个元素逐一赋值给变量
  • 每赋值一次,do和done之间的代码就会执行一次

1.2 列表的生成方式

方法1:直接给出列表元素【用空格分隔多个元素】

  • 1 33 12 9 haha baidu

方法2:用通配符来生成元素

  • /home/a*

方法3:用命令来生成元素

  • ls /etc/

方法4:用{ }展开的形式生成元素

  • {3..7}
  • {a..e}

1.3 案例

案例1:生成数字列表

#!/bin/bash

for num in {1..10}
do
    echo $num
    sleep 1  
    # 每次执行完睡眠1秒
done
  

案例2:检查172.16.100.1-10在线主机

#!/bin/bash

clear
echo "===============程序开始执行==================="

for num in {1..10}
do
    ip="172.16.100.$num"

    if ping -W1 -c1 $ip &>/dev/null;then
        echo "$ip is online"
    else
        echo "$ip is offline"
    fi
    
    sleep 0.5
done

echo "===============程序执行完毕==================="

案例3:生成字符串列表

#!/bin/bash

for xxx in {a..f}
do
    touch /tmp/$xxx.txt
done

案例4:判断/etc下每个文件的文件类型

#!/bin/bash
# 方法一
for fileName in `ls /etc/`
do
    if [ -f $fileName ];then
        echo "$fileName 是一般文件"
    elif [ -d $fileName ];then
        echo "$fileName 是目录文件"
    else
        echo "$fileName 是其他类型文件"
    fi
    sleep 0.5
done
#!/bin/bash
# 方法二:
for fileName in /etc/*
do
    if [ -f $fileName ];then
        echo "$fileName 是一般文件"
    elif [ -d $fileName ];then
        echo "$fileName 是目录文件"
    else
        echo "$fileName 是其他类型文件"
    fi
    sleep 0.5
done

二、while循环

2.1 while 循环的格式

格式1:正常循环的格式

while 条件
do
    代码
    代码
done

格式2:读取文件格式

while read line
do
    代码
    代码
done

2.2 案例

案例1:输出/etc/passwd 中每行有多少个字符,要求显示结果是 第x行,有x个字符

#!/bin/bash

m=1

while read line
do
    nums=`echo $line | wc -c`
    echo "第$m 行有$nums 个字符"
    m=$[$m+1]
done

案例2:输出每个用户的用户名和shell类型

#!/bin/bash

while read line
do
    name=`echo $line | awk -F ":" '{print $1)'`
    stype=`echo $line | awk -F ":" '{print $NF}'`
    echo "用户 $name 的shell类型是$stype";
done

案例3:输出1-100之间的数字

#!/bin/bash

num=1

while [ $num -le 100 ]
do
    echo $num
    num=$[$num+1]
done

案例4:每隔5s检查一次jerry是否登录系统

#!/bin/bash

while true
do
    sleep 5
    if who | grep "^jerry\>" &>/dev/null;then
        echo "jerry is online"
        exit 3
    else
        echo "jack is offline"
    fi

done

三、循环控制

break:终止循环-直接跳出循环

continue:立刻终止

案例1:每隔5s检查一次jerry是否登录系统

#!/bin/bash

while true
do
    sleep 5
    if who | grep "^jreey\>" &>/dev/null;then
        echo "jack is online"
        break
    else
        echo "jreey is offline"
        continue
    fi

done

案例2:99乘法表

#!/bin/bash

for num in {1..9}
do
    for num2 in {1..9}
    do
        echo -n "$num2*$num=$[$num*$num2]";
        echo -n " ";
        if [ $num -eq $num2 ];then
                break;
        fi
    done
    echo
done

四、函数

4.1 简介

函数就是一段代码
通过使用函数可以实现代码的复用,降低代码的冗余度,提高开发效率

定义函数的格式

函数名()
{
    代码
    代码
}

注意:函数无法直接使用,必须在调用的时候,才能运行

调用的函数的格式

函数名

案例:

#!/bin/bash

fun1()
{
    echo "函数开始了";
    echo "111";
    echo "函数结束了";
}

echo "start"
fun1
echo "stop"
fun1

4.2 内置函数库

/etc/init.d/functions

加载/引入函数库

source
.

linux中服务管理脚本的路径

/etc/rc.d/init.d

4.3 使用自己的函数库

首先创建一个函数库文件:/tmp/funlab

# my hahahahaha

show_user()
{
    echo "`whoami`"
}

show_host()
{
    echo "`hostname`"
}
    

然后在shell脚本中调用函数库中的函数

#!/bin/bash

. /tmp/funlab

echo "start"

show_user

echo "stop"

show_host
show_user
show_host
show_host

4.4 函数的输出和返回

函数的输出结果

  • 在函数中通过执行echo,向外输出内容

函数的返回结果

  • 用return XXX进行返回【return的值必须是数值类型】
  • 返回结果默认是不会显示出来的
  • 通常来说,在程序中,需要用一个变量来接收函数的返回结果

分析结果

#!/bin/bash
fun2(){
    echo "aaaaa"
    exit 4
    echo "bbbbb"
    return 3
    echo "cccc"
    echo "dddd"
}
echo "1111"

fun2
n=$?

echo "2222"

echo $n


=======================执行结果=====================
1111
aaaa
#!/bin/bash
fun2(){
    echo "aaaaa"
    return 4
    echo "bbbbb"
    exit 3
    echo "cccc"
echo "dddd"
}
echo "1111"

fun2
n=$?

echo "2222"

echo $n


=======================执行结果=====================
1111
aaaa
2222
4

五、变量

5.1 类型

环境变量:Linux内置的变量

自定义变量:用户自己定义的变量

位置变量:用于向脚本/函数传递参数

5.2 环境变量

一般环境变量都是大写的

  • set
  • env
PATH: 定义搜索命令的路径
USER: 当前用户的用户名
HOME: 当前用户的家目录
PS1: 当前用户的提示符
PS2: 当前用户的续航符
SHELL: 当前用户的shell类型
UID: 当前用户的uid

环境变量配置文件

  • 用户环境变量配置文件
    • 在用户家目录下,.bashrc .bash_profile
  • 系统环境变量配置文件
    • /etc下,bashrc和profile

修改环境变量

临时:

案例:修改PATH变量,将tmp添加到path变量中共
export PATH=$PATH:/tmp/

永久:

修改环境变量配置文件

vim /etc/bashrc
最后添加一行
export PATH=$PATH:/home

让当前会话生效
source /etc/bashrc

5.3 位置变量

位置变量,也称之为位置参数
作用是用于向函数或者向脚本传递参数的

接收变量的位置变量是:$0 $1 $2 $3 $$ $#

$# 参数的个数
$0 脚本名称
$1... 第几个参数
$$表示当前脚本的进程ID

案例:

#!/bin/bash

if [ $# -ne 3 ];then
    echo "error.参数错误"
    echo "Usage:$0 姓名 年龄 性别"
    exit 3
fi

echo "程序开始执行....";

echo "姓名是:$1"
echo "年龄是:$2"
echo "性别是:$3"

echo "脚本名称是:$0"
echo "脚本参数个数是:$#"
[root@localhost tmp]# ./6.sh tom 18 male
程序开始执行....
姓名是:tom
年龄是: 18
性别是:male
脚本名称是:./6.sh
脚本参数个数:3

案例:通过函数,判断两个数字的大小,输出较大的数字

#!/bin/bash

read -p "请输入数值1:" num1
read -p "请输入数值2:" num2

fun1()
{
    m=$1
    n=$2
    if [ $m -ge $n ];then
        echo "$m"
    else
        echo "$n"
    fi
}

fun1 $num1 $num2

你可能感兴趣的:(Linux,linux,运维,服务器)