bash编程练习题及答案

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`

=======================================================================


你可能感兴趣的:(编程,bash,练习题)