设为首页 收藏本站
查看: 1648|回复: 0

[经验分享] bash编程练习题及答案

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-4-15 08:38:59 | 显示全部楼层 |阅读模式
1、 删除/etc/grub.conf文件中行首的空白符
     sed s@^[[:space:]]*@@' /etc/grub.conf

2、 替换/etc/inittab文件中"id:3:initdefault:" 一行中的数字为5
3、 删除/etc/inittab文件中的空白行
      sed /^$/d /etc/inittab
4、 删除/etc/inittab文件中开头的#号
     sed 's/^#*//g' /etc/inittab
5、 删除某文件中开头的#号及后面的空白字符,但要求#号后面必须有空白字符
     sed s/^#[[:space:]]*//g 123.txt
6、 删除某文件中以空白字符后面跟#类的行中的开头的空白字符及#
         #abc
          # hello world
               #hi world
     sed s/^[[:space:]]*#//g 123.txt
7、 取出一个文件路径的目录名称
     /etc/fstab
     /var/log
     取出etc 和var
目录名:  
echo "/etc/rc.d/" | sed -r 's@^(/.*/)[^/]+/?@\1@g'
基名:
echo "/etc/rc.d/" | sed -r 's@^/.*/([^/]+)/?@\1@g'
老师标准答案:
sed练习:
1、删除/etc/grub.conf文件中行首的空白符;
sed -r 's@^[[:spapce:]]+@@g' /etc/grub.conf
2、替换/etc/inittab文件中"id:3:initdefault:"一行中的数字为5;
sed 's@\(id:\)[0-9]\(:initdefault:\)@\15\2@g' /etc/inittab
3、删除/etc/inittab文件中的空白行;
sed '/^$/d' /etc/inittab
4、删除/etc/inittab文件中开头的#号;
sed 's@^#@@g' /etc/inittab
5、删除某文件中开头的#号及后面的空白字符,但要求#号后面必须有空白字符;
sed -r 's@^#[[:space:]]+@@g' /etc/inittab
6、删除某文件中以空白字符后面跟#类的行中的开头的空白字符及#
sed -r 's@^[[:space:]]+#@@g' /etc/inittab
7、取出一个文件路径的目录名称;
echo "/etc/rc.d/" | sed -r 's@^(/.*/)[^/]+/?@\1@g'   
基名:
echo "/etc/rc.d/" | sed -r 's@^/.*/([^/]+)/?@\1@g'   

#abc
# hello world
   # hi world
     
练习:
传递一个用户名参数给脚本,判断此用户的用户名跟其基本组的组名是否一致,并将结果显示出来。
#!/bin/bash
#
if ! id $1 &> /dev/null; then
  echo "No such user"
  exit 10
fi
if [ `id -n -u $1` == `id -n -g $1` ]; then
  echo "The same"
else
  echo "Not the same"
fi
=================================================================
练习:写一个脚本
传递一个参数(单字符就行)给脚本,如参数为q、quit、Q、Quit,就退出脚本,否则, 就显示用户的参数:
#!/bin/bash
#
if [ $1 = 'q' ];then
  echo "Quitting"
  exit 0
elif [ $1 = 'Q'];then
  echo "Quiting"
  exit 1
elif [ $1 = 'Quit' ]; then
echo "Quitting"
  exit 2
elif [ $1 = 'QUIT' ]; then
  echo "quiting"
  exit 3
else
  echo "$1"
fi
=======================================================================
练习:
传递三个参数给脚本,第一个为整数,第二个为算术运算符,第三个为整数,将计算结果显示出来,要求保留两位精度。形如:
./calc.sh 5 / 2

提示:  
echo "scale=2;111/22;" | bc
bc <<< "scale=2;111/22"
#!/bin/bash
#
A=$1
x=$2
B=$3
result= echo "scale=2;$A$x$B;"|bc
echo $result
====================================================================
写一个脚本:
判断当前主机的CPU生产商,其信息在/proc/cpuinfo文件中vendor id一行中。
如果其生产商为AuthenticAMD,就显示其为AMD公司;
如果其生产商为GenuineIntel,就显示其为Intel公司;
否则,就说其为非主流公司;
#!/bin/bash
#
mycpu=`cat /proc/cpuinfo | grep vendor | cut -d: -f2 | head -1 | sed 's/^[[:space:]]//g'`
if [ $mycpu = "GenuineIntel" ]; then
  echo "INTEL chip inside"
elif [ $mycpu = "GenuineIntel" ]; then
  echo "AMD chip inside"
else
  echo "unkown cpu type"
fi
=====================================================================
写一个脚本:
给脚本传递三个整数,判断其中的最大数和最小数,并显示出来。
MAX=0
MAX -eq $1
MAX=$1
MAX -lt $2
MAX=$2
用两两比较法
#!/bin/bash
#
MAX=0
MIN=0
if [ $1 -lt $2 ]; then
  MAX=$2
  MIN=$1
else
  MAX=$1
  MIN=$2
fi
if [ $MAX -lt $3 ]; then
  MAX=$3
else
  MIN=$3
fi
echo "Max number is $MAX, the min number is $MIN"
======================================================================
练习:
传递3个参数给脚本,参数均为用户名。将此些用户的帐号信息提取出来后放置于/tmp/testusers.txt文件中,并要求每一行行首有行号。
echo "1 $LINES" >> / /tmp/testusers
echo "2 $LINES" >> / tmp/testusers
####脚本有问题###
!/bin/bash
#
for I in `seq 1 $#`;do
  #echo "`cat /etc/passwd | grep $I`" >> /tmp/tempusers
  echo $`$I`
done

=======================================================================
循环练习
向系统内所有用户问好:
LINES=`wc -l /etc/passwd | cut -d' ' -f1`
for I in `seq 1 $LINES`;do echo "Hello, `head -n $I /etc/passwd| tail -1 | cut -d: -f1`";done
======================================================================
写一个脚本:
1、设定变量FILE的值为/etc/passwd
2、依次向/etc/passwd中的每个用户问好,并显示对方的shell,形如:
     Hello, root, your shell: /bin/bash
3、统计一共有多少个用户

扩展: 只向默认shell为bash的用户问好
#!/bin/bash
#
FILE=/etc/passwd
LINES=`wc -l /etc/passwd| cut -d' ' -f1`
for I in `seq 1 $LINES`;do
  echo "Hello,`cat /etc/passwd | head -n $I | tail -1 | cut -d: -f1 ` , Your shell is `cat /etc/passwd| head -n $I | tail -1 | cut -d: -f7`"
done
扩展: 只向默认shell为bash的用户问好,
扩展版:
#!/bin/bash
#
SUM=0
FILE=/etc/passwd
LINES=`wc -l /etc/passwd| cut -d' ' -f1`
for I in `seq 1 $LINES`;do
  USER=`cat /etc/passwd | head -n $I | tail -1 | cut -d: -f1 `
  USHELL=`cat /etc/passwd| head -n $I | tail -1 | cut -d: -f7`
  if [[ $USHELL == '/bin/bash' ]]; then       #if $USHELL is null, then you     will get error with the     sinlge[], so please use     double[[]] when     judge the string equation.
  echo "Hello, $USER , Your shell is $USHELL"
  SUM=$[$SUM+1]
  fi
done
echo "Total user is $SUM"
=======================================================================
写一个脚本:
1、添加10个用户user1到user10,密码同用户名;但要求只有用户不存在的情况下才能添加;



#!/bin/bash
#
for I in `seq 1 10`; do
  if ! id user$I &> /dev/null; then
    useradd user$I &> /dev/null
    echo "user$I"| passwd --stdin user$I &> /dev/nul
  else
    echo "user$I already existed, will not create"
  fi
done
扩展:
接受一个参数:
add: 添加用户user1..user10
del: 删除用户user1..user10
其它:退出
#!/bin/bash
#
if [[ $1 == add ]]; then
  for I in `seq 1 10`; do
    if ! id user$I &> /dev/null; then
      useradd user$I &> /dev/null
      echo "user$I"| passwd --stdin user$I &> /dev/nul
    else
      echo "user$I already existed, will not create"
    fi
  done
elif [[ $1 == del ]];then
  echo "delete function is running"
  for I in `seq 1 10`;do
  userdel -rf user$I &> /dev/null
  done
fi
====================================================================
写一个脚本:
计算100以内所有能被3整除的正整数的和;
取模,取余:%
3%2=1
100%55=45
#!/bin/bash
#
SUM=0
for I in `seq 1 100`;do
  if [ $(($I%3)) = 0 ];then
    SUM=$[$SUM+$I]
  fi
done
echo "The sum is $SUM"
====================================================================

写一个脚本:
计算100以内所有奇数的和以及所有偶数的和;分别显示之;

#!/bin/bash
#
J=0
O=0
for I in `seq 1 100`;do
  if [ $(($I%2)) = 0 ]; then
    J=$[$J+$I]
  else
    O=$[$O+$I]
  fi
done
echo "SUM J is $J"
echo "SU O is $O"
=====================================================================
写一个脚本,分别显示当前系统上所有默认shell为bash的用户和默认shell为/sbin/nologin的用户,并统计各类shell下的用户总数。显示结果形如:
BASH,3users,they are:
root,redhat,gentoo

NOLOGIN, 2users, they are:
bin,ftp
可以追加到一个文件内,然后在 显示那个文件
#!/bin/bash
#
ushells=""
bash_count=0
nologin_count=0
LINES=`cat /etc/passwd | wc -l`
for I in `seq 1 $LINES`;do
  if [[ `cat /etc/passwd | head -n $I | tail -1 | cut -d: -f7` == /bin/bash ]]; then
   echo " `cat /etc/passwd | head -n $I | tail -1 | cut -d: -f1`" >> /tmp/bash_users
   bash_count=$[$bash_count+1]
  elif [[ `cat /etc/passwd | head -n $I | tail -1 | cut -d: -f7` == /sbin/nologin ]]; then
    echo " `cat /etc/passwd | head -n $I | tail -1 | cut -d: -f1`" >> /tmp/nologin_users
    nologin=$[$nologin+1]
  fi
done
echo "BASH, $bash_countusers, they are:"
echo `cat /tmp/bash_users`
echo "NOLOGIN, $nologin_countusers,they are:"
echo `cat /tmp/nologin_users`
=======================================================================


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-57235-1-1.html 上篇帖子: python安装及其tab补全 下篇帖子: 实现批量添加20个用户,用户名为user1-20,密码为user后面跟5 个随机字符 练习题
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表