四、shell编程练习题(1-20)

1、写一个脚本

脚本可以接受一个以上的文件路径作为参数;

显示每个文件所拥的行数;

显示本次共对多少个文件执行了行数统计。

#!/bin/bash
for file in $*; do
  lines=`wc -l $file | cut -d‘ ‘ -f1`
  echo "$file has $lines lines."
done
echo "$# files."

运行结果:
[[email protected] test]# sh 1.sh /etc/inittab 
/etc/inittab has 26 lines.
1 files.

2、分别计算100以内所有偶数之和和奇数之和

#!/bin/bash
eve=0
odd=0
for((i=1;i<=100;i++));do
  if `let i%2` ;then
    let odd=odd+i
  else
    let eve=eve+i
  fi
done
echo "奇数和为$odd,偶数和为$eve"

运行结果:
[[email protected] test]# sh  2.sh   
奇数和为2500,偶数和为2550

3、计算当前系统上所有用户的ID之和

#!/bin/bash
declare -i idsum=0
for i in `cut -d: -f3 /etc//passwd`;do    #由于51cto关键字限制,去掉一个‘/‘
  let idsum=idsum+i
done
echo $idsum
运行结果:
[[email protected] test]# sh 3.sh   
68489

4、新建10个用户tuser401-tuser410,并求他们的ID之和

#!/bin/bash
declare -i idsum=0
for i in {401..410};do
  useradd tuser$i
  userID=`id -u tuser$i`
  let idsum=idsum+userID
done
echo "ID sum: $idsum"

运行结果:
[[email protected] test]# sh 4.sh  
ID sum: 5045
[[email protected] test]# tail /etc//passwd     #由于51cto关键字限制,去掉一个‘/‘
tuser401:x:500:500::/home/tuser401:/bin/bash
tuser402:x:501:501::/home/tuser402:/bin/bash
tuser403:x:502:502::/home/tuser403:/bin/bash
tuser404:x:503:503::/home/tuser404:/bin/bash
tuser405:x:504:504::/home/tuser405:/bin/bash
tuser406:x:505:505::/home/tuser406:/bin/bash
tuser407:x:506:506::/home/tuser407:/bin/bash
tuser408:x:507:507::/home/tuser408:/bin/bash
tuser409:x:508:508::/home/tuser409:/bin/bash
tuser410:x:509:509::/home/tuser410:/bin/bash

5、写一个脚本

创建用户tuser501-tuser510;

创建目录/tmp/dir-当前日期时间;

在/tmp/dir-当前日期时间,目录中创建10个空文件file101-file110

将file101的属主改为tuser501,依次类推,一直将file110的属主改为tuser510。

#!/bin/bash
mkdir -p /tmp/dir/`date +%Y-%m-%d`
cd /tmp/dir/`date +%Y-%m-%d`
for i in {01..10};do
  useradd tuser5$i
  mkdir file1$i
  chown tuser5$i file1$i
done

运行结果:
[[email protected] test]# sh 5.sh 
[[email protected] test]# tail /etc//passwd       #由于51cto关键字限制,去掉一个‘/‘
tuser501:x:510:510::/home/tuser501:/bin/bash
tuser502:x:511:511::/home/tuser502:/bin/bash
tuser503:x:512:512::/home/tuser503:/bin/bash
tuser504:x:513:513::/home/tuser504:/bin/bash
tuser505:x:514:514::/home/tuser505:/bin/bash
tuser506:x:515:515::/home/tuser506:/bin/bash
tuser507:x:516:516::/home/tuser507:/bin/bash
tuser508:x:517:517::/home/tuser508:/bin/bash
tuser509:x:518:518::/home/tuser509:/bin/bash
tuser510:x:519:519::/home/tuser510:/bin/bash 
[[email protected] test]# ls -l /tmp/dir/2017-07-03/
总用量 40
drwxr-xr-x 2 tuser501 root 4096 7月   3 14:40 file101
drwxr-xr-x 2 tuser502 root 4096 7月   3 14:40 file102
drwxr-xr-x 2 tuser503 root 4096 7月   3 14:40 file103
drwxr-xr-x 2 tuser504 root 4096 7月   3 14:40 file104
drwxr-xr-x 2 tuser505 root 4096 7月   3 14:40 file105
drwxr-xr-x 2 tuser506 root 4096 7月   3 14:40 file106
drwxr-xr-x 2 tuser507 root 4096 7月   3 14:40 file107
drwxr-xr-x 2 tuser508 root 4096 7月   3 14:40 file108
drwxr-xr-x 2 tuser509 root 4096 7月   3 14:40 file109
drwxr-xr-x 2 tuser510 root 4096 7月   3 14:40 file110

6、分别统计/etc/rc.d/rc.sysinit、/etc/rc.d/init.d/functions和/etc/inittab文件中以#开头的行的行数和空白行数

#!/bin/bash
for file in /etc/rc.d/rc.sysinit /etc/rc.d/init.d/functions /etc/inittab;do
  echo "The lines contain # in $file is `grep -E "^#" $file | wc -l`."
  echo "The space lines in $file is `grep -E "^[[:space:]]*$" $file |wc -l`."
done

运行结果:
[[email protected] test]# sh 6.sh 
The lines contain # in /etc/rc.d/rc.sysinit is 44.
The space lines in /etc/rc.d/rc.sysinit is 103.
The lines contain # in /etc/rc.d/init.d/functions is 43.
The space lines in /etc/rc.d/init.d/functions is 106.
The lines contain # in /etc/inittab is 25.
The space lines in /etc/inittab is 0.

7、显示当前系统上所有默认shell为bash的用户的用户名、UID及其所有此类用户的UID之和

#!/bin/bash
grep "/bin/bash$" /etc//passwd | cut -d: -f1,3  #由于51cto关键字限制,去掉一个‘/‘
declare -i sum=0
for userID in `grep "/bin/bash$" /etc//passwd | cut -d: -f3`;do 
                                                #由于51cto关键字限制,去掉一个‘/‘
  let sum=sum+userID
done
echo "$sum"

运行结果:
[[email protected] test]# sh 7.sh  
root:0
0

8、显示当前系统上有附加组的用户的用户名;并统计共有多少个此类用户

[[email protected] test]# egrep ‘[^:]$‘ /etc/group | cut -d: -f4 | sort -u | egrep -o ‘[[:alnum:]]*‘ | sort -u

9、接受一个参数,这个参数是用户名;如果此用户存在,则显示其ID号

#!/bin/bash
read -p "请输入用户名:" username
if id $username &>/dev/null ;then
  echo "$username 的id为`grep "^\<$username\>" /etc//passwd | cut -d: -f3`"
else                              #由于51cto关键字限制,去掉一个‘/‘
  echo "无此用户"
fi

运行结果:
[[email protected] test]# sh 9.sh 
请输入用户名:mysql
mysql 的id为496
[[email protected] test]# sh 9.sh 
请输入用户名:123
无此用户

10、通过命令行传递两个整数参数给脚本,脚本可以返回其大者

#!/bin/bash
read -p "请输入两个整数:" a1 a2
if [ $a1 -gt $a2 ];then
  echo $a1
else
  echo $a2
fi

运行结果:
[[email protected] test]# sh 10.sh 
请输入两个整数:11 16
16
[[email protected] test]# sh 10.sh  
请输入两个整数:78 16
78

11、通过命令行传递任意个整数给脚本,脚本可以返回其大者

#!/bin/bash
declare -i num=0
for i in [email protected] ;do
 if [ $i -gt $num ];then
   let num=i
 fi
done
echo "最大数为:$num"

运行结果:
[[email protected] test]# sh 11.sh 7978 991 31 3321 32
最大数为:7978
[[email protected] test]# sh 11.sh 78 991 31 3321 32  
最大数为:3321

12、通过命令行给定一个文件路径,而后判断:如果此文件中存在空白行,则显示其空白行的总数;否则,则显示无空白行

#!/bin/bash
if grep "^[[:space:]]*$" $1 &>/dev/null ;then
  echo "$1 has $(grep "^[[:space:]]*$" $1 | wc -l) blank lines."
else
  echo "No blank lines."
fi

运行结果:
[[email protected] test]# sh 12.sh /etc//passwd     #由于51cto关键字限制,去掉一个‘/‘
No blank lines.
[[email protected] test]# sh 12.sh /etc/inittab 
No blank lines.
[[email protected] test]# sh 12.sh /etc/rc.sysinit 
/etc/rc.sysinit has 103 blank lines.

13、传递一个参数给脚本:

如果参数为quit,则显示说你要退出;

如果参数为yes,则显示说你要继续;

其它任意参数,则说无法识别。

#!/bin/bash
case $1 in
quit|Q)
  echo "退出程序"
  ;;
yes|Y)
  echo "继续"
  ;;
*)
  echo "无法识别"
  ;;
esac
运行结果:
[[email protected] test]# sh 13.sh  
无法识别
[[email protected] test]# sh 13.sh quit
退出程序
[[email protected] test]# sh 13.sh yes
继续

14、传递一个用户名给脚本:

如果此用户的id号为0,则显示说这是管理员;

如果此用户的id号大于等于500,则显示说这是普通用户

否则,则说这是系统用户;

#!/bin/bash
if id $1 &>/dev/null ;then
  userid=` grep "^\<$1\>" /etc//passwd | cut -d: -f3 `  #由于51cto关键字限制,去掉一个‘/‘
  if [ $userid -eq 0 ];then
    echo "$1 是管理员."
  elif [ $userid -ge 500 ];then
    echo "$1 是普通用户."
  else
    echo "$1 是系统用户."
  fi
else
  echo “无此用户.”
fi

运行结果:
[[email protected] test]# sh 14.sh mysql 
mysql 是系统用户.
[[email protected] test]# 
[[email protected] test]# sh 14.sh mysql 
mysql 是系统用户.
[[email protected] test]# sh 14.sh root
root 是管理员.
[[email protected] test]# sh 14.sh nfsnobody
nfsnobody 是普通用户.
[[email protected] test]# sh 14.sh nfsnobo
“无此用户.”

15、给定一个用户,如果其shell为/bin/bash且其ID号大于等于500,则说这是一个可登录普通用户;否则,则显示其为非登录用户或管理员。

#!/bin/bash
if id $1 &> /dev/null ;then
  userid=`grep "^\<$1\>" /etc//passwd | cut -d: -f3`   #由于51cto关键字限制,去掉一个‘/‘
  usershell=`grep "^\<$1\>" /etc//passwd | cut -d: -f7`#由于51cto关键字限制,去掉一个‘/‘
  if [ $userid -ge 500 ] && [ "$usershell"=="/bin/bash" ];then
    echo "$1 是可登录普通用户"
  else
    echo "$1 是非登陆用户或管理员"
  fi
else
  echo "无此用户."
fi

运行结果:
[[email protected] test]# sh 15.sh root
root 是非登陆用户或管理员
[[email protected] test]# sh 15.sh mysql
mysql 是非登陆用户或管理员
[[email protected] test]# sh 15.sh nfsnobody
nfsnobody 是可登录普通用户
[[email protected] test]# sh 15.sh nfsnobo
无此用户.

16、写一个脚本,如果某用户不存在,就添加

#!/bin/bash
if id $1 &> /dev/null ;then
  echo "$1 已存在."
else
  useradd $1
  echo "添加用户$1."
fi

运行结果:
[[email protected] test]# sh 16.sh mysql
mysql 已存在.
[[email protected] test]# sh 16.sh mylinux
添加用户mylinux.
[[email protected] test]# tail -1 /etc//passwd  #由于51cto关键字限制,去掉一个‘/‘
mylinux:x:500:500::/home/mylinux:/bin/bash

17、添加10个用户:tuser501-tuser510;如果用户不存在,才添加;如果存在,则显示已经有此用户;显示一共添加了多少个用户。

#!/bin/bash
declare -i num=0
for i in {501..510};do
  if id tuser$i &> /dev/null ;then
    echo "tuser$i 已存在"
  else
    useradd tuser$i
        echo "添加用户 tuser$i"
        let num++
  fi
done
echo "添加$num 个用户."

运行结果:
[[email protected] test]# sh 17.sh  
添加用户 tuser501
添加用户 tuser502
添加用户 tuser503
添加用户 tuser504
添加用户 tuser505
添加用户 tuser506
添加用户 tuser507
添加用户 tuser508
添加用户 tuser509
添加用户 tuser510
添加10 个用户.
[[email protected] test]# sh 17.sh 
tuser501 已存在
tuser502 已存在
tuser503 已存在
tuser504 已存在
tuser505 已存在
tuser506 已存在
tuser507 已存在
tuser508 已存在
tuser509 已存在
tuser510 已存在
添加0 个用户.

18、添加10个用户:tuser601-tuser610;如果用户不存在,才添加,并以绿色显示添加成功;如果存在,则以红色显示已经有此用户;显示一共添加了多少个用户。

#!/bin/bash
#
declare -i count=0
for i in {601..610}; do
  if id tuser$i &> /dev/null; then
    echo -e "\033[31mtuser$i\033[0m exists."
  else
        useradd tuser$i
        echo -e "add user \033[32mtuser$i\033[0m successfully."
        let count++
  fi
done
echo "Total add $count users."
运行结果:
[[email protected] test]# sh 18.sh 
add user tuser601 successfully.
add user tuser602 successfully.
add user tuser603 successfully.
add user tuser604 successfully.
add user tuser605 successfully.
add user tuser606 successfully.
add user tuser607 successfully.
add user tuser608 successfully.
add user tuser609 successfully.
add user tuser610 successfully.
Total add 10 users.
[[email protected] test]# sh 18.sh 
tuser601 exists.
tuser602 exists.
tuser603 exists.
tuser604 exists.
tuser605 exists.
tuser606 exists.
tuser607 exists.
tuser608 exists.
tuser609 exists.
tuser610 exists.
Total add 0 users.

19、传递用户名给脚本

判断此用户的shell是否为/bin/bash,如果是,则显示此用户为basher

否则,则显示此用户为非basher

#!/bin/bash
#
userShell=`grep "^$1\>" /etc//passwd | cut -d: -f7`  #由于51cto关键字限制,去掉一个‘/‘
if [ "$userShell" == ‘/bin/bash‘ ]; then
  echo "basher"
else
  echo "not basher"
fi
运行结果:
[[email protected] test]# sh 19.sh mysql
not basher
[[email protected] test]# sh 19.sh mylinux
basher

20、给定一个文件路径

判断此文件是否存在;不存在,则说明文件不存,并直接结束脚本;

如果文件是否普通文件,则显示为“regular file”;

如果文件是目录,则显示为“directory”;

如果文件是链接文件,则显示为“Symbolic file";

否则,则显示为“unknown type.”

#!/bin/bash
if [ ! -e $1 ];then
  echo "file not exit ."
  exit 5
fi
if [ -L $1 ];then
  echo "Symbolic file."
elif [ -d $1 ];then
  echo "directory."
elif [-f $1 ];then
  echo "regular file."
else
  echo "unknown type."
fi
运行结果:
[[email protected] test]# sh 20.sh /etc/
directory.
[[email protected] test]# sh 20.sh /etc/rc.d/rc1.d/K92iptables      
Symbolic file.
[[email protected] test]# sh 20.sh 12312
file not exit .
时间: 2024-10-12 17:43:22

四、shell编程练习题(1-20)的相关文章

实验四 shell 编程(2)

一.实验步骤 1.shell 变量基本用法及常用符号使用 (1)将 主提示符改为 用户的主目录名 export PS=$HOME (2)将字符串 DOS file c:>\$student\*赋值给变量 x,并显示出来 (3)在 shell 命令终端输入 likes=(cosmos galaxy moon); likes[6]=mars,然后使用 echo 分别显示以下表达式的值,并结合结果,写出表达式的作用. likes=(cosmos galaxy moon); likes[6]=mars:

实验四 shell编程(2)

1.  shell 变量基本用法及常用符号使用 (1)将主提示符改为用户的主目录名 重新登陆之后ps1值恢复默认值. (2)将字符串  DOS file   c:>\$student\*赋值给变量 x,并显示出来 若赋值的字符串中有空格时需要用双引号或者单引号括起来. (3)在 shell 命令终端输入 likes=(cosmos galaxy moon); likes[6]=mars,然后使用 echo 分别显示以下表达式的值,并结合结果,写出表达式的作用. ① ${likes[*]}:显示l

实验四 shell编程2

1. shell 变量基本用法及常用符号使用 此部分要求写出实现相应要求的 shell 命令,截图显示 (1) 将主提示符改为用户的主目录名 (提示:参考教材 4.6.8 节环境变量PS1 和HOME 的用法) (2) 将字符串 DOS file c:>\$student\*赋值给变量 x,并显示出来 (提示:注意引号的选择,同时确保字符串中多个空格.$.*等完全原样显示) (3) 在 shell 命令终端输入likes=(cosmos galaxy moon); likes[6]=mars,然

shell 编程练习题1

需求1:使用root用户清空/var/log/messages日志,并每次执行保留最近100行 ? 1.必须是root用户 ? 2.需要保留最后100行 [[email protected] if]# cat if-19.sh #!/bin/bash Author: Oldux.com QQ: 552408925 Date: 2019-10-30 FileName: if-19.sh URL: https://www.xuliangwei.com Description: Log_Path=/v

Shell编程进阶篇(完结)

1.1 for循环语句 在计算机科学中,for循环(英语:for loop)是一种编程语言的迭代陈述,能够让程式码反复的执行. 它跟其他的循环,如while循环,最大的不同,是它拥有一个循环计数器,或是循环变数.这使得for循环能够知道在迭代过程中的执行顺序. 1.1.1 shell中的for循环 shell中的for 循环与在c中不同,它包含三种形式:第一种结构是列表for 循环;第二种结构就是不带列表的for循环:第三种就类似于C语言. ①   列表for循环(常用) #!/bin/bash

centos shell编程6一些工作中实践脚本 第四十节课

centos   shell编程6一些工作中实践脚本    第四十节课 上半节课 下半节课 f

linux学习笔记四(shell编程)

前言:最近在学习shell编程,shell编程是一个很强大的编程语言. 目的:方便今后复习. 内容:1.简单的回顾一下编程语言                 1)编程语言:机器语言,汇编语言,高级语言.                 2)编程语言有静态和动态的区分.                             区别:静态语言是一种编译性的语言,要提前知道变量的格式,进过完整的编译之后才能运行,典型的静态语言包括:C.C++.JAVA.C#.                    

shell编程(十四)--- until循环

until循环语法格式: until CONDITION do     statement done 说明: until进入循环的条件是:condition不成立时,就执行循环. until进入循环的条件正好和while相反,while进入循环的条件是:condition成立时,就进入循环. 示例1:while循环 [[email protected] Learn]# cat while.sh  #!/bin/bash declare -i sum=0 declare -i i=0 while 

shell编程(四)--- 条件判断之if判断

单分支if语句 if 判断条件;then     statement1     statement2 fi 双分支if语句 if 判断条件;then     statement1     statement2     -- else     statement3     statement4     -- fi 多分支if语句 if 判断条件1;then     statement1     statement2     -- elif 判断条件2;then     statement3