1、编写脚本 systeminfo.sh,显示当前主机系统信息,包括:主机名,IPv4地址,操作系统版本,内核 版本,CPU型号,内存大小,硬盘大小

#!/bin/bash
echo -e "\e[31mHostname: `hostname`\e[0m"
echo -e "\e[32mIP: `hostname -I`\e[0m" 
echo -e "\e[33mOS Version: `cat /etc/os-release |grep "PRETTY"|cut -d'=' -f2`\e[0m"
echo -e "\e[34mKernel Version: `uname -r`\e[0m"
echo -e "\e[35mCPU:`lscpu | grep "Model name"|tr -s ' '|cut -d: -f2`\e[0m"
echo -e "\e[36mMemory Size:`lsmem | grep 'online memory'|tr -s ' '|cut -d: -f2`\e[0m"
echo -e "\e[37mDisk Size:`fdisk -l|head -1|cut -d',' -f1|cut -d: -f2`\e[0m"

2、编写脚本 backup.sh,可实现每日将/etc/目录备份到/backup/etcYYYY-mm-dd中

#!/bin/bash
DIR1="/etc"
DIR2="/backup/etc`date +%F`"
echo -e "\e[31mStarting backup...\e[0m"
if [ -e `dirname $DIR2` ];then
  sleep 3
  cp -av $DIR1 $DIR2
else
  mkdir `dirname $DIR2`
  sleep 3
  cp -av $DIR1 $DIR2
fi  
echo -e "\e[31mBackup Finished...\e[0m"

3、编写脚本 disk.sh,显示当前硬盘分区中空间利用率大的值

#!/bin/bash
echo -e "\e[34mDisk of max percentage is `df -h|tr -s ' ' :|grep '/dev/sd'|cut -d: -f5|sort -nr|head -1`.\e[0m"

4、编写脚本 links.sh,显示正连接本主机的每个远程主机的IPv4地址和连接数,并按连接数从大到小排 序

#!/bin/bash
echo -e "\e[35mConnections:\e[0m`netstat -tan|grep "ESTABLISHED"|tr -s ' ' :|cut -d: -f6|sort -nr|uniq -c`"

5、编写脚本 argsnum.sh,接受一个文件路径作为参数;如果参数个数小于1,则提示用户“至少应该给 一个参数”,并立即退出;如果参数个数不小于1,则显示第一个参数所指向的文件中的空白行数

#!/bin/bash
read -p "请至少输入一个文件路径(作为参数):" ARG
if [ $# -lt 0 ];then
  echo "至少应该给一个参数"
  exit
else
  grep '^$' $ARG |wc -l
fi  

6、编写脚本 hostping.sh,接受一个主机的IPv4地址做为参数,测试是否可连通。如果能ping通,则提 示用户“该IP地址可访问”;如果不可ping通,则提示用户“该IP地址不可访问”

#!/bin/bash
read -p "请输入一个主机的IPv4地址:" IPADDR
ping -c 1 -W 1 $IPADDR &> /dev/null
if [ $? -eq 0 ];then
  echo -e "\e[31m此IP地址可访问\e[0m"
else
  echo -e "\e[31m此IP地址不可访问\e[0m"
fi  

7、编写脚本 checkdisk.sh,检查磁盘分区空间和inode使用率,如果超过80%,就发广播警告空间将满

#!/bin/bash
WARNING=80
SPACE_USED=`df -h|tr -s ' ' %|cut -d% -f5|sort -nr|head -1`
INODE_USED=`df -hi |tr -s ' ' %|cut -d% -f5| sort -nr|head -1`
if [ $SPACE_USED -gt $WARNING ] && [ $INODE_USED -gt $WARNING ];then
  mail -s DiskWarning root
else
  echo "空间还很充裕"
fi  

8、编写脚本 per.sh,判断当前用户对指定参数文件,是否不可读并且不可写

#!/bin/bash
read -p "请输入一个文件名:" FILENAME
[ ! -r $FILENAME -a -w $FILENAME ] 
if [ $? -eq 0 ];then
  echo -e "\e[31m此用户对该文件不可读并且不可写\e[0m" 
else
  echo -e "\e[34m此用户对该文件可读或者可写\e[0m"
fi  

9、编写脚本 excute.sh ,判断参数文件是否为sh后的普通文件,如果是,添加所有人可执行权限, 否则提示用户非脚本文件

#!/bin/bash
read -p "请输入一个文件:" FILENAME
[[ "$FILENAME" =~ \.sh$ ]] && chmod +x $FILENAME || echo -e "\e[35m此文件为非脚本文件\e[0m"

10、编写脚本 nologin.sh和 login.sh,实现禁止和允许普通用户登录系统

#!/bin/bash
FILE=/data/nologin
[ ! -f FILE ] && touch /data/nologin && { echo "已禁止普通用户登陆系统"; exit ; } || { echo "已禁止普通用户"; exit ; }

#!/bin/bash
FILE=/data/nologin
[ -f FILE ] && rm -rf /data/nologin && { echo "已禁止普通用户登陆系统"; exit ; } || { echo "已禁止普通用户"; exit ; }

11、让所有用户的PATH环境变量的值多出一个路径,例如:/usr/local/apache/bin

echo "export PATH=/usr/local/apache/bin:$PATH" >> /etc/profile
. /etc/profile
echo $PATH

12、用户 root 登录时,将命令指示符变成红色,并自动启用如下别名: rm=‘rm –i’ cdnet=‘cd /etc/sysconfig/network-scripts/’ editnet=‘vim /etc/sysconfig/network-scripts/ifcfg-eth0’ editnet=‘vim /etc/sysconfig/network-scripts/ifcfg-eno16777736 或 ifcfg-ens33 ’ (如果系统是 CentOS7)
vim ~/.bashrc
在行尾追加新内容:

PS1="\[\e[1;31m\][\[\e[0m\]\[\e[1;31m\]\u\[\e[31m\]@\h\[\e[1;31m\] \W\[\e[1;31m\]]\[\e[0m\]\\$ "
alias rm='rm -i'
alias cdnet='cd /etc/sysconfig/network-scripts/'
alias editnet='vim /etc/sysconfig/network-scripts/ifcfg-eth0' 

13、任意用户登录系统时,显示红色字体的警示提醒信息“Hi,dangerous!”
echo -e "\e[1;31mHi,dangerous! \e[0m" > /etc/motd

14、编写生成脚本基本格式的脚本,包括作者,联系方式,版本,时间,描述等

vim ~/.vimrc
添加内容:
set ignorecase
set cursorline
set autoindent
autocmd BufNewFile *.sh exec ":.call SetTitle()"
func SetTitle()
if expand("%:e") == 'sh'
call setline(1,"#!/bin/bash")
call setline(2,"#***********************************************")
call setline(3,"#Author:        Kingdom_Xu")
call setline(4,"#Mail:          [email protected]")
call setline(4,"#Version:       1.0")
call setline(5,"#Date:          ".strftime("%Y-%m-%d"))
call setline(6,"#FileName:      ".expand("%"))
call setline(7,"#Description:   The test script")
call setline(8,"#***********************************************")
call setline(9,"")
endif
endfunc
autocmd BufNewFile * normal G

15、编写用户的环境初始化脚本reset.sh,包括别名,登录提示符,vim的设置,环境变量等

#!/bin/bash
#创建一个别名cdnet
#登录提示符为绿色
#使用vim自动显示行号
#设置登录后显示欢迎标语
cat <> ~/.bashrc
alias cdnet='cd /etc/sysconfig/network-scripts'
PS1="\[\e[1;32m\][\[\e[0m\]\[\e[1;32m\]\u\[\e[32m\]@\h\[\e[1;32m\] \W\[\e[1;32m\]]\[\e[0m\]\\$ "
EOF
cat <> ~/.vimrc
set nu
EOF
echo "echo Hello" >> /etc/bashrc

16、编写脚本 createuser.sh,实现如下功能:使用一个用户名做为参数,如果指定参数的用户存在,就 显示其存在,否则添加之;显示添加的用户的id号等信息

#!/bin/bash``
read -p "请输入一个用户名:" NAME
id $NAME &> /dev/null
if [ `echo $?` -eq 0 ];then
  echo "此用户已经存在"
else 
  useradd $NAME
  id $NAME
fi  

17、编写脚本 yesorno.sh,提示用户输入yes或no,并判断用户输入的是yes还是no,或是其它信息

#!/bin/bash
read -p "Do you agree(yes|no):" ANS
case $ANS in
[yY]|[yY][eE][sS])
  echo "Your answer is YES."
  ;;
[nN]|[nN][oO])
  echo "Your answer is NO."
  ;;
*)
  echo "Please answer is yes or no."
esac  

18、编写脚本 filetype.sh,判断用户输入文件路径,显示其文件类型(普通,目录,链接,其它文件类 型)

#!/bin/bash
read -p "请输入一个文件名:" FILE
if [ -f $FILE ];then
  echo "普通文件"
elif [ -d $FILE ];then
  echo "目录"
elif [ -L $FILE ];then
  echo “链接文件”
else 
  echo "其他文件类型"
fi  

19、编写脚本 checkint.sh,判断用户输入的参数是否为正整数

#!/bin/bash
read -p "请输入一个整数:" INT
if [ $INT -ge 0 ];then
  echo "$INT是正整数"
else
  echo "$INT不是正整数"
fi  

练习:用for实现
1、判断/var/目录下所有文件的类型

#!/bin/bash
for i in $file;do
  if [ -f /var/$i ];then
    echo "普通文件"
  elif [ -d /var/$i ];then
    echo "目录"
  elif [ -L /var/$i ];then
    echo "链接文件"
  else
    echo "其他文件"
  fi
done  

2、添加10个用户user1-user10,密码为8位随机字符

#!/bin/bash
for i in {1..10};do
  id user$i &> /dev/null
  if [ $? -eq 0 ];then
    echo "user$i已经存在"
  else
    useradd user$i
    echo "user$i" | passwd --stdin user$i &> /dev/null
    echo "user$i创建成功"
  fi
done  

3、/etc/rc.d/rc3.d目录下分别有多个以K开头和以S开头的文件;分别读取每个文件,以K开头的输出为 文件加stop,以S开头的输出为文件名加start,如K34filename stop S66filename start

#!/bin/bash
DIR=`ls /etc/rc.d/rc3.d/`
for I in file;do
  find /etc/rc.d/rc3.d/S* -exec mv {} "{} start" \; &> /dev/null
  find /etc/rc.d/rc3.d/K* -exec mv {} "{} stop" \; &> /dev/null
done  

4、编写脚本,提示输入正整数n的值,计算1+2+…+n的总和

#!/bin/bash
read -p "请输入正整数n的值:" N
for ((i=1,sum=0;i<=N;i++));do
  let sum+=i
done 
echo "The sum is $sum"

5、计算100以内所有能被3整除的整数之和

#!/bin/bash
for ((i=1,sum=0;i<=100;i++));do
    let c=$i%3
    if [ $c -eq 0 ];then
      let sum+=i
  fi  
done
echo "The sum is $sum."

6、编写脚本,提示请输入网络地址,如192.168.0.0,判断输入的网段中主机在线状态

#!/bin/bash
net=192.168.0
for i in `seq 254`;do
  ping -c 1 -W 1 $net.$i &> /dev/null
  if [ $? -eq 0 ];then
    echo -e "\e[32m$net.$i is up.\e[0m"
  else
    echo -e "\e[31m$net.$i is dowm.\e[0m"
  fi
done

7、打印九九乘法表

#!/bin/bash
for ((i=1;i<=9;i++));do
  for ((j=$i;j<=9;j++));do
    echo -e "${i}x${j}=$[i*j]\t\c"
  done
done  

8、在/testdir目录下创建10个html文件,文件名格式为数字N(从1到10)加随机8个字母,如: 1AbCdeFgH.html

#!/bin/bash
DIR=/testdir
for i in `seq 10`;do
  [ ! -d $DIR ] && mkdir -pv $DIR &> /dev/null
  N=`openssl rand -base64 10|sed -nr "s/[^[:alpha:]]//pg"|head -c 8`
  touch $DIR/$i$N.html
done  

9、打印等腰三角形

read -p "please input triangle line: " line
for ((j=1;j<=$line;j++));do
COL_LOG='\e[1;5;'
COL_AND='\e[0m'
  for ((a=1;a<=line-j;a++));do
    echo -e " \c"
  done
  sum=echo 2*$j-1|bc
  for ((i=1;i<=${sum};i++));do
    RAND="$[$RANDOM%7+31]m"
    echo -e "${COL_LOG}${RAND}* \c"
  done
  echo -e "${COL_AND}"
done

10、猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个。第二天早上又将剩下的桃子 吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,只 剩下一个桃子了。求第一天共摘了多少?

#!/bin/bash
sum=1
for ((n=1;n<10;n++));do
  sum=$[2*$[$sum+1]]
done
echo "所摘桃子数: $sum"``

练习:用while实现
1、编写脚本,求100以内所有正奇数之和

#!/bin/bash
sum=0
i=1
while [ $i -le 100 ];do
  let sum+=i
  let i+=2
done
echo "100以内所有正奇数之和为$sum"

2、编写脚本,提示请输入网络地址,如192.168.0.0,判断输入的网段中主机在线状态,并统计在线和 离线主机各多少

#!/bin/bash
net=192.168.1
i=1
up=0
down=0
while [ $i -le 254 ];do
  ping -c 1 -W 1 $net.$i &> /dev/null
  if [ $? -eq 0 ];then
    echo -e "\e[32m$net.$i is up.\e[0m"
    let up++
  else
    echo -e "\e[31m$net.$i is down.\e[0m"
    let down++
  fi  
  let i++
done
echo -e "\e[32mUp is $up.\e[0m"
echo -e "\e[31mDown is $down.\e[0m"

3、编写脚本,打印九九乘法表

#!/bin/bash
i=1
while [ $i -le 9 ];do
  j=1
  while [ $j -le $i ];do
    echo -e "${i}x${j}=$[i*j]\t\c"
    let j++
  done
  let i++
done

4、编写脚本,利用变量RANDOM生成10个随机数字,输出这个10数字,并显示其中的大值和小值

i=1
while true;do
  NUM=$RANDOM
  if [ "$i" -eq "1" ];then
    MAX=$NUM
    MIN=$NUM
  else  
    if [ "$MAX" -lt "${num[$i]}" ];then
      MAX=${num[$i]}
    elif [ "$MIN" -gt "${num[$i]}" ];then
      MIN=${num[$i]}
    else
      true
    fi
  fi
  let i++
done
echo "num is : ${num[@]}"
echo "最大值MAX:$MAX 最小值MIN:$MIN"

5、编写脚本,实现打印国际象棋棋盘

#!/bin/bash
i=1
D_COLOR='\033[1;41m'
S_COLOR='\033[1;47m'
AND_COLOR='\033[0m'
while [ $i -le 8 ];do
  if [ "$[$i%2]" -eq "0" ];then
    j=1
    while [ $j -le 8 ];do
      if [ "$[$j%2]" -eq "0" ];then
        echo -e "${S_COLOR} ${AND_COLOR}\c"
      else
        echo -e "${D_COLOR} ${AND_COLOR}\c"
      fi
      let j++
    done
  else
    j=1
    while [ $j -le 8 ];do
      if [ "$[$j%2]" -eq "0" ];then
        echo -e "${D_COLOR} ${AND_COLOR}\c"
      else
        echo -e "${S_COLOR} ${AND_COLOR}\c"
      fi
      let j++
    done
  fi
  echo ""
  let i++
done

6、后续六个字符串:efbaf275cd、4be9c40b8b、44b2395c46、f8c8873ce0、b902c16c8b、 ad865d2f63是通过对随机数变量RANDOM随机执行命令: echo $RANDOM|md5sum|cut –c1-10 后的结果,请破解这些字符串对应的RANDOM值

#!/bin/bash
RAN=1
cat test.txt | while read CHESS;do
  { while true;do
    MD=echo $RAN|md5sum|cut -c1-10
    if [[ "$MD" == "$CHESS" ]];then
      echo $RAN
      break
    else
      let RAN++
    fi
  done }&
  wait
done

函数练习:

  1. 编写函数,实现OS的版本判断

    #!/bin/bash
    versions() {
    NUM=`cut -d' ' -f4 /etc/centos-release|cut -d'.' -f1`
    if [ $NUM -eq 8 ];then
    echo -e "\e[1;31mThe system's version is 8.\e[0m"
    elif [ $NUM -eq 7 ];then
    echo -e "\e[1;32mThe system's version is 7.\e[0m"
    else
    echo -e "\e[1;33mThe system's version is 6.\e[0m"
    fi
    }                                                                               
    versions
  2. 编写函数,实现取出当前系统eth0的IP地址

    #!/bin/bash
    getip() {
    NUM=`cut -d' ' -f4 /etc/centos-release|cut -d'.' -f1`
    if [ $NUM -eq 8 ];then
    IP=`ifconfig eth0|sed -n '2p'|tr -s ' ' :|cut -d: -f3`
    echo -e "\e[1;31mThe system's version is 8.\neth0: $IP\e[0m"
    elif [ $NUM -eq 7 ];then
    IP=`ifconfig eth0|sed -n '2p'|tr -s ' ' :|cut -d: -f3`
    echo -e "\e[1;32mThe system's version is 7.\neth0: $IP\e[0m"
    else
    IP=`ifconfig eth0|sed -n '2p'|tr -s ' ' :|cut -d: -f4`
    echo -e "\e[1;33mThe system's version is 6.\neth0: $IP\e[0m"
    fi
    }
    getip                     
  3. 编写函数,实现打印绿色OK和红色FAILED

    #!/bin/bash
    colors() {
    echo -e "\e[1;32mOK\e[0m"
    echo -e "\e[1;31mFAILED\e[0m"
    }
    colors    
  4. 编写函数,实现判断是否无位置参数,如无参数,提示错误

    #!/bin/bash
    args() {
    if [ $# -eq 0 ];then
    echo -e "\e[1;31mError,no argument.\e[0m"
    else
    echo -e "\e[1;32mHave $# argument.\e[0m"
    fi
    }
    . args.sh
    args 3 hello hi
    args 
  5. 编写函数,实现两个数字做为参数,返回最大值

    #!/bin/bash
    compare() {
    read -p "Please inpunt two digits:" NUM1 NUM2
    if [ $NUM1 -le $NUM2 ];then
    echo -e "\e[1;33mThe max is $NUM2.\e[0m"
    fi
    }
    compare   
  6. 编写服务脚本/root/bin/testsrv.sh,完成如下要求
    (1) 脚本可接受参数:start, stop, restart, status
    (2) 如果参数非此四者之一,提示使用格式后报错退出
    (3) 如是start:则创建/var/lock/subsys/SCRIPT_NAME, 并显示“启动成功”
    考虑:如果事先已经启动过一次,该如何处理?
    (4) 如是stop:则删除/var/lock/subsys/SCRIPT_NAME, 并显示“停止完成”
    考虑:如果事先已然停止过了,该如何处理?
    (5) 如是restart,则先stop, 再start
    考虑:如果本来没有start,如何处理?
    (6) 如是status, 则如果/var/lock/subsys/SCRIPT_NAME文件存在,则显示“SCRIPT_NAME is
    running...”,如果/var/lock/subsys/SCRIPT_NAME文件不存在,则显示“SCRIPT_NAME is
    stopped...”
    (7)在所有模式下禁止启动该服务,可用chkconfig 和 service命令管理
    说明:SCRIPT_NAME为当前脚本名
#!/bin/bash
. /etc/rc.d/init.d/functions
FILE=/var/lock/subsys/testsrv
func1() {
  [ ! -e $FILE ] &&  mkdir -p $FILE && echo -e "\e[1;34m启动成功\e[0m"
}
func2() {
  [ -e $FILE ] && rm -rf $FILE && echo -e "\e[1;35m停止完成\e[0m"
} 
func3() {
  [ -e $FILE ] && echo -e "\e[1;36m$FILE is running...\e[0m" || echo -e "\e[1;37m$FILE is stopped...\e[0m"
}

case $1 in
'start')
  sleep 2
  func1
  ;;
'stop')
  sleep 2
  func2
  ;;
'restart')
  sleep 2
  func2
  sleep 2
  func1
  ;;
'status')
  sleep 2
  func3
  ;;
*)
  echo -e "\e[1;35mUsage: `basename $0` [start|stop|restart|status]\e[0m"
  exit 1
esac  

chkconfig --add testsrv &> /dev/null
chkconfig testsrv off &> /dev/null
  1. 编写脚本/root/bin/copycmd.sh
    (1) 提示用户输入一个可执行命令名称
    (2) 获取此命令所依赖到的所有库文件列表
    (3) 复制命令至某目标目录(例如/mnt/sysroot)下的对应路径下
    如:/bin/bash ==> /mnt/sysroot/bin/bash
    /usr/bin/passwd ==> /mnt/sysroot/usr/bin/passwd
    (4) 复制此命令依赖到的所有库文件至目标目录下的对应路径下: 如:/lib64/ld-linux-x86-
    64.so.2 ==> /mnt/sysroot/lib64/ld-linux-x86-64.so.2
    (5)每次复制完成一个命令后,不要退出,而是提示用户键入新的要复制的命令,并重复完成上述
    功能;直到用户输入quit退出