马哥教育网络班22期+第九周课程练习

1. 写一个脚本,判断当前系统上所有用户的shell是否为可登录shell(即用户的shell不是/sbin/nologin);分别这两类用户的个数;通过字符串比较来实现;

#!/bin/bash
#
declare -a loginuser
declare -i sum_login=0
declare -i sum_nologin=0
list=($(cat /etc/passwd |awk -F: '{print $NF}'))

for ((i=1;i<=${#list[*]};i++));do
   if [[ "${list[i]}" == "/sbin/nologin" ]];then
       let sum_nologin=$sum_nologin+1
   else [[ "${list[i]}" == "/bin/bash" ]]
       let sum_login=$sum_login+1
   fi
done
   echo "no login users is $sum_nologin"
   echo "login users is $sum_login"

2. 写一个脚本 
(1) 获取当前主机的主机名,保存于hostname变量中; 
(2) 判断此变量的值是否为localhost,如果是,则将当前主机名修改为www.magedu.com; 
(3) 否则,则显示当前主机名;

#!/bin/bash
#
hostname=$(hostname)
if [[ $hostname == "localhost" ]];then
   hostname wwww.magedu.com
else
   echo $hostname
fi

3. 写一个脚本,完成如下功能 
(1) 传递一个磁盘设备文件路径给脚本,判断此设备是否存在; 
(2) 如果存在,则显示此设备上的所有分区信息;

#!/bin/bash
#
if [ $# -lt 1 ];then
   echo "Usage:`basename $0` devicename"
   exit 3
fi

if [ -e $1 ];then
   fdisk -l $1
else
   echo "Without this device"
fi

4. 写一个脚本,完成如下功能 
脚本能够接受一个参数; 
(1) 如果参数1为quit,则显示退出脚本,并执行正常退出; 
(2) 如果参数1为yes,则显示继续执行脚本; 
(3) 否则,参数1为其它任意值,均执行非正常退出;

#!/bin/bash
#
read -p "Please input your choice:" option

while [[ $option == "yes" ]];do
   read -p "Please input your choice again:" option
done

if [[ $option == "quit" ]];then
   echo "Quit"
   exit 0
else
   echo "Error"
   exit 3
fi

5. 写一个脚本,完成如下功能 
传递一个参数给脚本,此参数为gzip、bzip2或者xz三者之一; 
(1) 如果参数1的值为gzip,则使用tar和gzip归档压缩/etc目录至/backups目录中,并命名为/backups/etc-20160613.tar.gz; 
(2) 如果参数1的值为bzip2,则使用tar和bzip2归档压缩/etc目录至/backups目录中,并命名为/backups/etc-20160613.tar.bz2; 
(3) 如果参数1的值为xz,则使用tar和xz归档压缩/etc目录至/backups目录中,并命名为/backups/etc-20160613.tar.xz; 
(4) 其它任意值,则显示错误压缩工具,并执行非正常退出;

#!/bin/bash
#
if [ $# -lt 1 ];then
   echo "Usage:`basename $0` {gzip|bzip2|xz}"
   exit 3
fi

if [ -d /backups ];then
   return
else
   mkdir /backups &>/dev/null
fi

case $1 in
gzip)
tar -zcvf /backups/etc-$(date "+%Y%m$d").tar.gz /etc
;;
bzip2)
tar -jcvf /backups/etc-$(date "+%Y%m$d").tar.bz2 /etc
;;
xz)
tar -Jcvf /backups/etc-$(date "+%Y%m$d").tar.xz /etc
;;
*)
echo "Unkown"
;;
esac

6. 写一个脚本,接受一个路径参数: 
(1) 如果为普通文件,则说明其可被正常访问; 
(2) 如果是目录文件,则说明可对其使用cd命令; 
(3) 如果为符号链接文件,则说明是个访问路径; 
(4) 其它为无法判断;

#!/bin/bash
#
if [ $# -lt 1 ];then
   echo "Usage:`basename $0` Path1"
   exit 3
fi

if [[ -f $1 ]];then
   echo "This is a common file"
elif [[ -d $1 ]];then
   echo "This is a directory."
elif [[ -L $1 ]];then
   echo "This is a Links file"
else
   echo "Unknow"
fi

7. 写一个脚本,取得当前主机的主机名,判断 
(1) 如果主机名为空或为localhost,或为”“(none)”“,则将其命名为mail.magedu.com; 
(2) 否则,显示现有的主机名即可;

#!/bin/bash
#
if [ "$(hostname)" == "" -o "$(hostname)" == "localhost" ];then
   hostname "mail.magedu.com"
else
   echo "$(hostname)"
fi

8. 写一脚本,接受一个用户名为参数; 
(1) 如果用户的id号为0,则显示其为管理员; 
(2) 如果用户的id号大于0且小于500, 则显示其为系统用户; 
(3) 否则,则显示其为普通用户;

#!/bin/bash
#
if [ $# -lt 1 ];then
   echo "Usage:`basename $0` USERNAME"
   exit 3
fi

if ! id -u $1 &>/dev/null ;then
   echo "User $1 is not exists."
else
   if [ `id -u $1` -eq 0 ];then
       echo "User $1 is admin user"
   elif [ `id -u $1` -lt 500 ];then
       echo "User $1 is system user"
   else
       echo "User $1 is common user"
   fi
fi

10. 写一个脚本,传递一个用户名参数给脚本; 
(1) 如果用户的id号大于等于500,且其默认shell为以sh结尾的字符串,则显示“a user can log system.”类的字符串; 
(2) 否则,则显示无法登录系统;

#!/bin/bash
#
if [ $# -lt 1 ];then
   echo "Usage:`basename $0` USERNAME"
   exit 3
fi

if ! id -u $1 &>/dev/null ;then
   echo "User $1 is not exists"
else
   if [ "`id -u $1`" -ge "500" -a "`cat /etc/passwd |grep $1 |grep -o  sh$`" == "sh" ];then
       echo "A user can log system"
   else
       echo "Can not login to the system"
   fi
fi

11. 写一个脚本,完成如下任务 : 
(1) 按顺序分别复制/var/log目录下的每个直接文件或子目录至/tmp/test1-testn目录中; 
(2) 复制目录时,才使用cp -r命令; 
(3) 复制文件时使用cp命令; 
(4) 复制链接文件时使用cp -d命令; 
(5) 余下的所有类型,使用cp -a命令;

#!/bin/bash
#
file=/var/log/*

for i in $file;do
   if [ -d $i ];then
       cp -r $i /tmp/test1-testn
   elif [ -f $i ];then
       cp $i /tmp/test1-testn
   elif [ -L $i ];then
       cp -d $i /tmp/test1-testn
   else
       cp -a $i /tmp/test1-testn
   fi

done

原创文章,作者:N22-白蚁,如若转载,请注明出处:http://www.178linux.com/65482

(0)
N22-白蚁N22-白蚁
上一篇 2017-01-03 11:05
下一篇 2017-01-03 11:05

相关推荐

  • bash通配符和正则表达式元字符部分归纳

    Linux中有各种各样的字符,而且在不同环境和不同命令之下含义也不同 作为新手,决定先归纳学到的符号,方便后面学习厘清它们之间的关系。 glob 简化了的正则表达式 bash默认通配符: ? :只匹配一个任意字符; * :匹配零个或多个任意字符;   [^] :方括号及其中^中的取反 [abc]:匹配任何一个列在方括号中的字符(这个例子要么匹配一个…

    Linux干货 2016-04-11
  • linux shell 脚本详解

    . Linux  shell 脚本编写基础◆1.1 语法基本介绍1.1.1 开头程序必须以下面的行开始(必须方在文件的第一行):#!/bin/sh符号#!用来告诉系统它后面的参数是用来执行该文件的程序。在这个例子中我们使用/bin/sh来执行程序。当编辑好脚本时,如果要执行该脚本,还必须使其可执行。要使脚本可执行:编译 chmod +x filen…

    2017-08-05
  • 磁盘管理:raid和lvm练习

    本文通过以下习题,巩固所学raid和lvm知识: 20160829         1、创建一个可用空间为1G的RAID1设备,文件系统为ext4,有一个空闲盘,开机可自动挂载至/backup目录       &nbsp…

    Linux干货 2016-09-05
  • linux中for的用法

    关于linuxbash shell中的for语句 在linux中shell是必不可少的一部分,但是在bash shell中有while,for,until等循环命令,今天就介绍一下关于for的一些用法。文中任何错误希望大佬们一一指出,不胜感激。 bashshell中提供了for命令,用于创建通过一系列值重复的循环,每次重复使用系列中的一个值执行一个定义的命令…

    2017-07-15
  • sed工具 介绍

    sed工具 地址定界 不给地址:对全文进行处理 单地址: #:指定行 /pattern/:被此处模式所能够匹配到的每一行 地址范围: #,# #,+# /pat1/,/pat2/ #,/pat1/ ~:步进 1~2 奇树行 2~2 偶数行 cat -n passwd >passwd2 新建文件 sep -n ‘/^h//^s/’…

    Linux干货 2017-05-31
  • Python函数式编程指南(二):函数

    这是此系列的第二篇,试图说明在Python中如何更好地使用函数并引导诸位使用函数式的思维进行思考。掌握并应用这些内容,就已经是至少形似的函数式风格的代码了,至于思维么,这个真靠自己。 作者水平有限,如有错漏之处还请指出;转载请注明原作者和原地址:) 2. 从函数开始 2.1. 定义一个函数 如下定义了一个求和函数: def add(x, y): return…

    Linux干货 2015-03-11

评论列表(1条)

  • 马哥教育
    马哥教育 2017-01-04 16:08

    脚本写的很棒,排版也很漂亮,但是注意,不要使用系统的命令来作为变量名,加油