Shell实例整理

5 篇文章 0 订阅

一、批量创建用户

批量创建1000个用户
用户名为:班级+学号+昵称;每个班为一个组群
能够自动删除所创建的用户
每成功创建或删除一个用户,在屏幕上显示用户名

#!/bin/bash

echo "==========create the group=========="
read -p "input the groupname what you want to create:" a

A=`cut -d: -f1 /etc/group|grep $a|wc -w`

if [ $A -eq 1 ]
then
    echo "groupname already exist,please go ahead"

else
    groupadd $a
fi

echo "==========how many users you want to add=========="
read -p "input the numbers of users: " num
count=1

while [ $count -le $num ]
do
    B=`cut -d: -f1 /etc/passwd|grep ${a}Student$count|wc -w`
    if [ $B -eq 1 ]
    then
        echo "The user ${a}Student$count is already exist!"
    else
        useradd -G $a ${a}Student$count
        echo "user ${a}Student$count add successfully"
    fi
    count=$(($count + 1))
done

read -p "do you want remove the new users? y or n: " do

let count=count-1
if [ "$do" = y ]
then
    for(( count; count >= 1;count-- ))
    do
           userdel -r ${a}Student$count
           echo "user ${a}Student$count del successfully"
    done
else exit
fi

二、批量创建目录和文件

目录名为:dir1, dir2, …, dir10
每个目录下分别新建10个文本文件,文件名为:目录名+file1~10
并设置每个文件的权限:
文件所有者:读+写+执行
同组用户:读+执行
其他用户:读+执行
等待键盘输入一个数字,范围为1~10
重命名该级目录(假设输入数字为“5”,则为“dir5”目录)下所有文件的扩展名为bak,并将该目录下所有文件名保存到一个文本文件
删除包含该数字的所有目录和文件

#!/bin/bash
 #
# 目录名为:dir1, dir2, …, dir10
# 每个目录下分别新建10个文本文件,文件名为:目录名+file1~10
# 并设置每个文件的权限:
# 文件所有者:读+写+执行
# 同组用户:读+执行
# 其他用户:读+执行
# 等待键盘输入一个数字,范围为1~10
# 重命名该级目录(假设输入数字为“5”,则为“dir5”目录)下所有文件的扩展名为bak,
# 并将该目录下所有文件名保存到一个文本文件
# 删除包含该数字的所有目录和文件
function addFile(){
  for((i=1;i<=10;i++))
 do
mkdir /usr/src/dir$i
chmod 755 -R /usr/src/dir$i
for((j=1;j<=10;j++))
do
   touch /usr/src/dir$i/dir${i}file$j
done
done
}
read -p "which files(1~10) do you want to option:" num
addFile
ls /usr/src/dir$num >> /usr/src/fileOut.txt
#mv /usr/src/dir$num/dir${num}file* /usr/src/dir$num/dir${num}file*.bak
cd /usr/src/dir$num
for f in `ls /usr/src/dir$num`
do 
   mv $f $f.bak
done
echo "option successfully"
read -p "are you sure to remove this directory which with this number:" op
case $op in
y)
rm -rf /usr/src/dir$num ;;
 *)
exit;; 
esac

三、定时备份文件

每天18:00归档/etc目录下的所有文件,归档文件名为如下形式:etc-YYYY-MM-DD;保存在/home/user/backup目录下,其中user为当前登录用户名
需要编写一个脚本,放到/etc/cron.d/script :

#!/bin/bash

DATE=`date +%F`
tar -cvf /etc-$DATE /etc
mkdir /home/$USER/backup
mv /etc-$DATE /home/$USER/backup

四、查找统计

查看/etc/passwd中所有包含字符串“aa”的用户,并将结果保存在文本文件中

grep "aa.*" /etc/passwd|cut -d: -f1 >file   

查看/bin中包含字符串“ls”的文件名,并将结果保存在文本文件中

ls /bin|grep "ls.*" >file                  

把/bin和/sbin下的文件名保存到文件commandview中

ls /bin /sbin >commandview

统计/bin和/sbin下的文件数量

ls /bin |wc -l
ls /sbin|wc -l

脚本代码:

#!/bin/bash
#查看/etc/passwd中所有包含字符串“aa”的用户,并将结果保存在文本文件中
grep "aa.*" /etc/passwd|cut -d : -f1 >> /home/luzy/practice1/text/file1
echo ‘******************’ >> /home/luzy/practice1/text/file1
#查看/bin中包含字符串“ls”的文件名,并将结果保存在文本文件
ls /bin |grep "ls.*" >> /home/luzy/practice1/text/file1
echo ‘******************’ >> /home/luzy/practice1/text/file1
#把/bin和/sbin下的文件名保存到文件command中
ls /bin /sbin >> /home/luzy/practice1/text/command
#echo ‘******************’ >> /home/luzy/practice1/text/file1
#统计/bin和/sbin下的文件数量
ls /bin | wc -l  >> /home/luzy/practice1/text/file1
ls /sbin | wc -l  >> /home/luzy/practice1/text/file1

五、加减乘除运算

两个操作数和一个运算符由位置参数给出 在屏幕上分别显示操作数、运算符和运算结果

#!/bin/bash
read -p "input first num: " a
read -p "input +-*/ : " b
read -p "input second num: " c

jg=`echo "scale=2; $a $b $c"|bc`
echo " $a $b $c = $jg "
echo "========================================================================="
read -p "Do you want to continue? y/n:" C

case $C in
y) sh ys.sh;;
n) exit;;
esac    

六、按照运行结果编写Shell程序:

0
101
21012
3210123
432101234
54321012345
6543210123456
765432101234567
87654321012345678
9876543210123456789

#!/bin/bash

for ((i=0;i<=9;i++))
do 
    j=$i
    for ((j;j>=0;j--))
    do
        echo -n "$j"
    done
    k=1
    for ((k;k<=i;k++))
    do 
        echo -n "$k"
    done
echo
done

七、逆序输出一个字符串

#!/bin/bash
#逆序输出一个字符串
read -p "please input string:" str
echo "$str" | rev

八、冒泡法对10个数按升序排序

#!/bin/bash
#冒泡排序十个数
for((i=0;i<=9;i++))
do
#使用内置随机变量产生十个1000以内的数
  arr[i]=$(($RANDOM%1000)) 
done
echo "${arr[@]}"
function fm(){
for((a=0;a<=9;a++))
do
  for((b=a+1;b<=9;b++))
  do
   if [[ ${arr[a]} -gt ${arr[b]} ]]
    then
        x=${arr[a]}
        arr[$a]=${arr[b]}
        arr[$b]=$x
    fi
   done

echo "${arr[a]}"

done  
echo "${arr[@]}"
}
fm

九、编写一个menu的Shell程序,执行后的界面为:

NumberNameFor Linux Menu
1exitleave
2viedit a file
3datedate
4calcalendar
5wholist the users
6lslist the files in this directory
7catdisplay a file on the screen
Please input a number or a name for the action you wish:

#!/bin/bash

echo "NumberNameFor Linux Menu"
cat << EOF
1 exitleava
2 viedit a file
3 datedate
4 calcalendar
5 wholist the users
6 lslist the files in this directory
7 catdisplay a file on the screen
EOF

read -p "Please input a number or a name for the action you wish:" num

case $num in
1) exit;;
2) read -p "Input a filename:" A
   vi $A;;
3) date;;
4) cal;;
5) cut -d: -f1 /etc/passwd;;
6) ls -la .;;
7) read -p "Input a filename:" B
   cat $B;;
esac
echo "========================================================================="
read -p "Do you want to continue? y/n:" C

case $C in
y) sh menu.sh;;
n) exit;;
esac 

十、求n的阶乘

#!/bin/bash
#求n的阶乘
#方法一
function mathod1(){
  a=1
  for((i=1;i<=num;i++))
  do
    a=` expr $i \* $a `
  done
  echo "${num}! = $a"

  }
 #方法二
  function m2(){
   if [ $1 -eq 1 ]
     then
     echo "1"
   else
     local x=$[ $1 -1 ]
     local y=`m2 $x`
     a=`expr ${x} \* ${y}`
  #  echo " $[ $1 - 1 ]! = ${a}"
     echo "$a"
      fi
 }
read -p " please input a number(>0):" num
read -p " which mathod you chose(1 or 2) :" m
case $m in
1)
mathod1 ;;
2)
re=`m2 $[ $num + 1 ]`
echo "${num}!= $re";;
*)
echo "no such mathod!"
;;
esac

Shell实例二

一、需求分析

1.任务目标

Linux作为多用户、多任务的操作系统,其系统资源是所有用户共享的。对用户的管理是操作系统的重点。LINUX课程设计要用shell编程实现,将理论学习付诸实践。设计一个脚本(shell)程序能实现增加、删除、查找和显示特定用户信息的功能。

2.系统要求

程序要包括四个文件,即menu,add,delete,passwd四个文件。passwd文件是用来保存用户信息;menu文件是主菜单,要求运行的时候能显示一个菜单供用户选择;add文件是用来增加信息;delete文件是用来删除信息。在主Shell脚本文件里(必须以 menu 命名)要有一个多操作选项的菜单以便用户从中选择。对于任务6和7,需要编写单独的Shell脚本文件(必须分别命名为add和delete)并且在主脚本menu文件中调用这些脚本文件。在主目录下建立一个以 07wl-0x-xx(x为班、座号)命名的目录,并且在作业中使用它作为工作目录。

3.系统功能

在主Shell脚本文件里(即menu 文件)要有一个多操作选项的菜单以便用户从中选择。在不同任务的中,这些操作能自动实现以下功能:

1、在屏幕上显示当前所有用户的记录

2、在屏幕上显示当前所有用户(经过格式化和排序的)的记录

3、只在屏幕上显示用户名和用户ID

4、只在屏幕上显示(经过格式化和排序的)用户名和用户ID

5、查询并显示特定用户的记录

6、往passwd文件里增加新的用户记录

7、从passwd文件里删除某个用户记录

其中: menu文件中的程序完成1,2,3,4,5功能;另外写一个add脚本文件和delete脚本文件分别实现选项6和7.当用户做了选择且所选的操作完成之后,可以再次显示主菜单以供用户做下一步选择。用while循环和case条件语句配合来完成此操作。

二、总体设计

  1. 功能图

  1. 流程图

    2.1 主菜单

2.2 add模块 

![](http://i.imgur.com/pXkCndp.png)

2.3 delete模块

![](http://i.imgur.com/0GSv58g.png)

三、详细设计

一、 Menu主菜单

(1)主菜单

(2)创建如下菜单

(3)无效输入

当用户做了选择且所选的操作完成之后,应再次显示主菜单以供用户做下一步选择。在以上等待用户做出选择的菜单中,如果用户偶尔输入了一个代码而不是1、2、3、4、5、6、7或Q,就有信息提示“无效的代码,请按回车键继续”。等用户按了回车键之后,再次显示主菜单供用户做其他选择。如图:

(4)无输入

在以上等待用户做出选择的菜单中,如果用户简单地按了回车键,就会出现信息“无效的代码"。等用户按了回车键之后,再次显示主菜单供用户做其他选择。

(5)选择1时——打印当前所有用户记录

(6)选择2时——打印当前经格式化的用户记录

(7)选择3时——打印用户名和用户ID

(8)选择4时——打印(格式化)用户名和用户ID

(9)选择5时——查找特定的记录

如果输入的关键字不在记录里

如果用户简单地按回车键而不是输入关键字

二、ADD文件

(1)当用户在主菜单里选择6时你的add脚本文件就要被调用

(2)输入用户名

用户输入一个无效的用户名

用户只按回车没有输入

(3)输入密码

输入密码时不显示

要求密码长度至少达到6位以上

确认密码如果与密码不符合应该让用户重新输入

(4)用户ID

若用户只是简单的按回车键

若用户输入的是一个无效的ID或者是不符合格式的ID

(5)组ID

对组ID的要求类似与用户ID,一个有效的组ID(数字、一般非超级用户的ID大等于500)

(6)登录shell

一个有效的shell必须只能是bash、sh、kash、csh中的一种

如果用户只按回车没有输入的话则显示信息:“没有输入!”,并提示用户再次输入shell名

(7)保存记录

三、DELETE文件

(1)当用户在主菜单中选择7时,delete脚本文件必须被调用

(2)用户输入一个无效的用户ID

(3)用户简单的按回车键而没有任何输入

(4)继续删除

四、附录(程序代码)

1、Menu主脚本文件代码

#!/bin/bash
#在屏幕上操作选项菜单
#声明全局变量
dataSource=/home/luzy/practice2/passwd
homePath=/home/luzy/practice2
AddUser=/home/luzy/practice2/Add.sh
DeleteUsers=/home/luzy/practice2/Delete.sh
CheckDataSourceFileExist(){
if [ -f $dataSource ]
then
  #文件存在
  return 0;
else
  #文件不存在
  clear;
  echo -n "警告【$dataSource】不存在!请确认!";
  read;
  return 1;
fi
}
choice="F";
while [ $choice != "Q" -a $choice != "q" ]
do
 CheckDataSourceFileExist;
 if [ $? -ne 1 ]
 then
     clear;
     echo "                用户信息管理主菜单";
     echo "===================================================";
     echo "        1.显示当前所有记录"
     echo "        2.格式化显示当前所有记录"
     echo "        3.显示用户名和用户ID"
     echo "        4.格式化显示用户名和ID"
     echo "        5.查询特定用户信息"
     echo "        6.添加新用户"
     echo "        7.删除用户"
     echo "        Q.退出"
     echo -n "你的选择:"
     read choice



     #作用是清除由于read到string.Empty的时候引发的bash参数过多的错误。
        if [ -z $choice ]
        then
            choice="empty";
        fi

        clear;
        if [ $choice = "empty" ];
        then
            echo "选项尚未选择!";
        else
            case $choice in
                1) CheckDataSourceFileExist;
                    if [ $? -ne 1 ]
                    then
                        echo "当前的所有的用户信息如下所示:";
                        echo "用户名 密码 ID GID 说明 工作目录 登录Shell"
                        cat $dataSource | tr ":" " " | more;
                    fi;;
                2)     CheckDataSourceFileExist;
                        if [ $? -ne 1 ]
                        then
                            echo "当前的所有的用户信息如下所示:";
                            echo -e "用户名\t密码\tID\tGID\t说明\t工作目录\t登录Shell"
                            sort -k 1 $dataSource | awk -F ":" '{print $1 "\t" $2 "\t" $3   
                            "\t" $4 "\t" $5 "\t" $6 "\t" $7 "\t"}' | more;
                        fi;;
                3) CheckDataSourceFileExist;
                    if [ $? -ne 1 ]
                    then
                        echo "当前的所有的用户的用户名和用户ID如下所示:";
                        echo -e "用户名,ID";
                        awk -F ":" '{print $1 "," $3}' $dataSource | more;
                    fi;;
                4)     CheckDataSourceFileExist;
                        if [ $? -ne 1 ]
                        then
                            echo "当前的所有的用户的用户名和用户ID如下所示:";
                            echo -e "用户名 \t ID";
                            awk -F ":" '{print $1 "\t "  $3}' $dataSource | more;
                        fi;;
                5) CheckDataSourceFileExist;
                    if [ $? -ne 1 ]
                    then
                        keyWords="";
                        while [ -z $keyWords ]
                        do
                            echo -n "输入搜索关键词:";
                            read keyWords;

                            if [ -z $keyWords ]
                            then
                                echo "搜索关键词不能为空,请重新输入!";
                            fi
                        done

                    CheckDataSourceFileExist;
                    if [ $? -ne 1 ]
                    then
                        grep -i $keyWords $dataSource;

                        if [ $? -eq 1 ]
                        then
                            echo "很遗憾,【$dataSource】文件中,并不存在与 $keyWords 一致的信息。";
                        fi
                    fi
                    fi;;
                6) $AddUser ;;
                7) $DeleteUsers ;;
                Q) printf "程序已经退出。";;
                q) printf "程序已经退出。";;
                *) echo $choice ":此选项不是默认提供的功能。请确认。";;
            esac
        fi

        echo -n "确认??";
        read ;
    fi
done

2、ADD脚本文件代码

#!/bin/bash
#添加用户
dataSource=/home/luzy/practice2/passwd
clear;    
  isContinue="y";
  userName="";
  while [ $isContinue = "y" -o $isContinue = "Y" ]
  do
    #用户名处理,输入一致到字符串长度不为0为止
    userName="";
    while [ -z $userName ]
    do
        echo -n "用户名:";
        read userName;
        if [ -z $userName ]
        then
            echo "错误!用户名是不能为空的,请重新输入!";
            continue;
        fi

        if [ `expr match $userName "[a-zA-Z][0-9a-zA-Z]*"` -ne `expr length $userName` ]
        then
            echo "错误!用户名的只能由非数字打头的字符和数字组成,请重新输入!";
            userName="";
            continue;
        fi
    done

    #密码处理:1.验空,3.密码长度要6位,由大小写字母、数字和控制字符组成,2.验两次输入的一致性,
    passWord="";
    passWordAgain="";
    while [ -z $passWord ]
    do
        echo -n "密码:";
        read passWord;

        if [ -z $passWord ]
        then
            echo "错误!密码是不能为空的,请重新输入!";
            continue;
        fi

        if [ `expr length $passWord` -ne 6 ]
        then
            echo "密码长度为6位,请重新输入!";
            passWord="";
            continue;
        fi

        if [ `expr match $passWord "[0-9a-zA-Z]*"` -ne `expr length $passWord` ]
        then
            echo "密码由大小写字母、数字和控制字符组成,请重新输入!";
            passWord="";
            continue;
        fi

        echo -n "请在输入一次密码:";
        read passWordAgain;

        if [ $passWordAgain != $passWord ]
        then
            echo "两次输入的密码不一样,请重新输入!";
            passWord="";
            continue;
        fi
    done

    #用户UID输入处理,UID为数字、一般非超级用户的ID大等于500
    uID="";
    while [ -z $uID ]
    do
        echo -n "用户UID:";
        read uID;

        if [ -z $uID ]
        then
            echo "错误!用户UID是不能为空的,请重新输入!";
            continue;
        fi

        if [ `expr match $uID "[0-9]*"` -ne `expr length $uID` ]
        then
            echo "错误!用户的UID必须为数字,请重新输入!";
            uID="";
            continue;
        fi

        if [ $uID -lt 500 -o $uID -gt 60000 ]
        then
            echo "错误!一般非超级用户的ID范围为500~60000,请重新输入!";
            uID="";
            continue;
        fi
    done


    #用户组GID处理
    gID="";
    while [ -z $gID ]
    do
        echo -n "用户组GID:";
        read gID;

        if [ -z $gID ]
        then
            echo "错误!用户GID是不能为空的,请重新输入!";
            continue;
        fi

        if [ `expr match $gID "[0-9]*"` -ne `expr length $gID` ]
        then
            echo "错误!用户的GID必须为数字,请重新输入!";
            gID="";
            continue;
        fi

        if [ $gID -lt 500 -o $gID -gt 60000 ]
        then
            echo "错误!用户组的ID范围为500~60000,请重新输入!";
            gID="";
            continue;
        fi
    done

    echo -n "说明:";read note;

    #bash,sh,csh,ksh
    shellVersion="";
    while [ -z $shellVersion ]
    do
        echo -n "登录SHELL(bash,sh,csh,ksh):";
        read shellVersion;
        if [ $shellVersion != "bash" -a $shellVersion != "sh" 
            -a $shellVersion != "csh" -a $shellVersion != "ksh" ]
        then
            echo "输入的Shell类型【$shellVersion】不在本系统支持范围内,请重新输入!";
            shellVersion="";
        fi
    done

    echo -n "用户工作目录:";
    mkdir /home/$userName;
    if [ $? -eq 0 ]
    then
        echo $userName "成功创建!";
    fi

    userInfo="${userName}:${passWord}:${uID}:${gID}:${note}:${userName}:${shellVersion}";
    echo "$userInfo" >> ${dataSource};

    if [ $? -eq 0 ]
    then
        echo "$userName用户信息添加成功!";
    else
        echo "$userName用户信息添加失败!";
    fi


    echo -n "是否继续添加其他用户??(y/n)";
    read isContinue;    
done

3、DELETE脚本文件代码

#!/bin/bash
#删除用户
clear;
dataSource=/home/luzy/practice2/passwd
CheckDataSourceFileExist()
{
if [ -f $dataSource ]
then
    #文件存在
    return 0;

else
    #文件不存在
    clear;
    echo -n "警告 【$dataSource】 不存在!请确认!";
    read ;
    return 1;
fi
}

isContinue="y";
userName="";
while [ $isContinue = "y" -o $isContinue = "Y" ]
do
    while [ $isContinue = "y" -o $isContinue = "Y" ]
    do
        echo -n "输入用户的名称:";
        read userName;
        if [ -z "$userName" ]
        then
            echo "用户名不能为空,请重新输入!";
            isContinue="Y";
            continue;
        fi

        CheckDataSourceFileExist;
        if [ $? -ne 1 ]
        then
            deleteUser=$(awk -F ":" '$1 == "'$userName'" { print $0 }' $dataSource);

            if [ $deleteUser ]
            then
                echo "目标帐号确认:" $deleteUser;
                echo -n "是否删除该信息??(y/n)";
                read isContinue;
                if [ -z $isContinue ]
                then
                    isContinue="N";
                fi

                if [ $isContinue = "y" -o $isContinue = "Y"  ]
                then
                    CheckDataSourceFileExist;
                    if [ $? -ne 1 ]
                    then
                        rowID=$(grep -n $deleteUser $dataSource | awk -F ":" '{print $1}');
                         sed -e "$rowID d" $dataSource > tempFile;
                        cat tempFile > $dataSource;
                        rm tempFile;
                    fi

                    if [ $? -eq 0 ]
                    then
                        echo "删除成功!";
                    else
                        echo "系统错误,删除失败!";
                    fi

                    isContinue="N";
                fi
            else
                echo "你输入的 【$userName】 用户不存在!";
                isContinue="N";
            fi
        fi
    done

    if [ -n "$userName" ]
    then
        echo -n "是否继续删除其他用户??(y/n)";
        read isContinue;
        if [ -z $isContinue ]
        then
            isContinue="N";
        fi
    fi
 done

4、passwd文件

raccoon:123321:600:700:nothing:raccoon:sh
wangjun:000000:601:701:gogo:wangjun:sh
English:888888:602:702:Hi:English:sh
  • 6
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值