返回顶部

Linux shell脚本实现磁盘管理实战

过程式编程语言的执行流程:

  • 顺序执行
  • 选择执行
  • 循环执行

选择执行:

  • (1) &&, ||
  • (2) if语句
  • (3) case语句

shell 编程之 if 语句详解

if语句:三种格式

单分支的if语句

if CONDITION; then
  if-true-分支;
fi

双分支的if语句

if  CONDITION; then
    if-true-分支
else
    if-false-分支
fi

多分支的if语句

if  CONDITION1; then
    条件1为真分支
elif  CONDITION2; then
    条件2为真分支
elif  CONDITION3; then
    条件3为真分支
...
elif  CONDITIONn; then
    条件n为真分支
else
    所有条件均不满足时的分支
fi

注意:即便多个条件可能同时都能满足,分支只会执行中其中一个,首先测试为“真”;

示例:脚本参数传递一个文件路径给脚本,判断此文件的类型;

#!/bin/bash
#
if [ $# -lt 1 ]; then
    echo "At least on path."
    exit 1
fi

if ! [ -e $1 ]; then
    echo "No such file."
    exit 2
fi

if [ -f $1 ]; then
    echo "Common file."
elif [ -d $1 ]; then
    echo "Directory."
elif [ -L $1 ]; then
    echo "Symbolic link."
elif [ -b $1 ]; then
    echo "block special file."
elif [ -c $1 ]; then
    echo "character special file."
elif [ -S $1 ]; then
    echo "Socket file."
else
    echo "Unkown."
fi	

练习:写一个脚本

  • (1) 传递一个参数给脚本,此参数为用户名;
  • (2) 根据其ID号来判断用户类型:
  • 0: 管理员
  • 1-999:系统用户
  • 1000+:登录用户
#!/bin/bash
#
[ $# -lt 1 ] && echo "At least on user name." && exit 1

! id $1 &> /dev/null && echo "No such user." && exit 2

userid=$(id -u $1)

if [ $userid -eq 0 ]; then
    echo "root"
elif [ $userid -ge 1000 ]; then
    echo "login user."
else
    echo "System user."
fi		


练习:写一个脚本

(1) 列出如下菜单给用户:

disk) show disks info;
mem) show memory info;
cpu) show cpu info;
*) quit;

 

(2) 提示用户给出自己的选择,而后显示对应其选择的相应系统信息;

#!/bin/bash
#
cat << EOF
disk) show disks info
mem) show memory info
cpu) show cpu info
*) QUIT
EOF

read -p "Your choice: " option

if [[ "$option" == "disk" ]]; then
    fdisk -l /dev/[sh]d[a-z]
elif [[ "$option" == "mem" ]]; then
    free -m
elif [[ "$option" == "cpu" ]];then
    lscpu
else
    echo "Unkown option."
    exit 3
fi

shell 编程之 for  语句详解

循环执行: 将一段代码重复执行0、1或多次;

进入条件:条件满足时才进入循环;

退出条件:每个循环都应该有退出条件,以有机会退出循环;

bash脚本:

  • for循环
  • while循环
  • until循环

for循环:

两种格式:

  • (1) 遍历列表
  • (2) 控制变量

遍历列表:

  • 进入条件:只要列表有元素,即可进入循环;
  • 退出条件:列表中的元素遍历完成;
for  VARAIBLE  in  LIST; do
    循环体
done

LISTT的生成方式:

  • (1) 直接给出;
  • (2) 整数列表
  • (a) {start..end}
  • (b) seq [start [incremtal]] last
  • (3) 返回列表的命令
  • (4) glob
  • (5) 变量引用
  • $@, $*
  • ...

简单小案例

#!/bin/bash
#
for username in user21 user22 user23; do
    if id $username &> /dev/null; then
        echo "$username exists."
    else
        useradd $username && echo "Add user $username finished."
    fi
done

示例:求100以内所有正整数之和;

#!/bin/bash
#
declare -i sum=0

for i in {1..100}; do
    echo "\$sum is $sum, \$i is $i"
    sum=$[$sum+$i]
done

echo $sum

示例:判断/var/log目录下的每一个文件的内容类型

#!/bin/bash
#
for filename in /var/log/*; do
    if [ -f $filename ]; then
        echo "Common file."
    elif [ -d $filename ]; then
        echo "Directory."
    elif [ -L $filename ]; then
        echo "Symbolic link."
    elif [ -b $filename ]; then
        echo "block special file."
    elif [ -c $filename ]; then
        echo "character special file."
    elif [ -S $filename ]; then
        echo "Socket file."
    else
        echo "Unkown."
    fi					
done

 

posted @ 2019-10-20 21:18  Crazymagic  阅读(700)  评论(0编辑  收藏  举报