shell练习题

计算器

calc.sh

#!/bin/bash
echo "$*=$(($*))"

比较整数大小

#!/bin/bash
read -a num -p "请输入两个整数: "
[ ${#num[*]} -eq 2 ] || {
  echo "参数不是两个"
  exit 5
}
[[ "${num[0]}" =~ ^[0-9]+$ ]] || {
  echo "${num[0]} 不是数字"
  exit 1
}
[[ "${num[1]}" =~ ^[0-9]+$ ]] || {
  echo " ${num[1]} 不是数字"
  exit 2
}

if [ ${num[0]} -gt ${num[1]} ];then
  echo "${num[0]}>${num[1]}"
elif [ ${num[0]} -eq ${num[1]} ];then
  echo "${num[0]}=${num[1]}"
else
  echo "${num[0]}<${num[1]}"
fi

判断输入是整数

function isnum(){
  NUM=$1
  if [[ $NUM =~ ^[0-9]+$ ]];then
    echo $NUM is num
  else
    echo $NUM is not num
  fi
}

判断是否为数字

function isnum(){
  NUM=$1
  if [[ $NUM =~ ^[0-9]+\.[0-9]+$ || $NUM =~ ^[0-9]+$ ]];then
    echo $NUM is num
  else
    echo $NUM is not num
  fi
}

判断输入非空

function input_judge(){
  RETVAL=0
  fun_a=$1
  [ ${#fun_a} -eq 0 ]&& RETVAL=1
  return $RETVAL
}

检测软件包是否安装

#!/bin/bash
function check_package(){
  (($#!=1)) && { 
    echo $"Usage: sh $0 package" 
    return 2
  }
  package="$1"
  if rpm -q $package &>/dev/null;then
    echo "$package is already installed"
    return 0
  else
    echo "$package is not install"
    return 1
  fi

}
check_package $1

资源监控

监控CPU使用率

#!/bin/bash
DATE=$(date +%F" "%T)
IP=$(hostname -I |awk '{print $1}')
MAIL="1226032602@qq.com"
US=$(vmstat |awk 'NR==3{print $13}')
SY=$(vmstat |awk 'NR==3{print $14}')
ID=$(vmstat |awk 'NR==3{print $15}')
WAIT=$(vmstat |awk 'NR==3{print $16}')
USE=$((US+SY))
#echo "USE=$USE"
if ((USE>60));then
  echo "
  Date: $DATE
  Host: $IP
  Problem: CPU utilization $USE
  " |mail -s "CPU WARN" $MAIL &> /dev/null
fi

监控内存使用率

#!/bin/bash
DATE=$(date +%F" "%T)
IP=$(hostname -I |awk '{print $1}')
MAIL="10000@qq.com"
FREE=$(free -m |awk '/Mem/{print $NF}')
#echo "FREE=$FREE"
if ((FREE<1024));then
  echo "
  Date: $DATE
  Host: $IP
  Problem: Memory Free=$FREE
  " |mail -s "Memory WARN" $MAIL &> /dev/null
fi

磁盘使用率

#!/bin/bash
DATE=$(date +%F" "%T)
IP=$(hostname -I |awk '{print $1}')
MAIL="1226032602@qq.com"
TOTAL=$(fdisk -l |awk -F'[: ]+' '/^Disk \/dev/{printf "%s=%sG",$2,$3}')
PART_USE="$(df -h |awk 'BEGIN{OFS="="}/^\/dev/{print $1,int($5),$6}')"
for i in $PART_USE;do
  PART=$(echo $i |awk -F "=" '{print $1}')
  USE=$(echo $i |awk -F "=" '{print $2}')
  MOUNT=$(echo $i |awk -F "=" '{print $3}')
  if ((USE>2));then
    echo "
    Date: $DATE
    Host: $IP
    Total: $TOTAL
    Problem: $PART USE $USE $MOUNT
    " |mail -s "Disk WARN" $MAIL &> /dev/null
  fi
done

检测服务状态

if ps -ef |grep -v grep |grep nginx &> /dev/null && ss -lntup |grep nginx &> /dev/null;then
  echo "nginx is running"
else
  echo "nginx is not running"
fi
SERVER_PROCESS="ps -ef |grep -v grep |grep nginx &> /dev/null"
SERVER_PORT="ss -lntup |grep nginx &> /dev/null"
if eval $SERVER_PROCESS && eval $SERVER_PORT;then
  echo "nginx is running"
else
  echo "nginx is not running"
fi
SERVER="nginx"
SERVER_PROCESS="ps -ef |grep -v grep |grep $SERVER &> /dev/null"
SERVER_PORT="ss -lntup |grep $SERVER &> /dev/null"
if eval $SERVER_PROCESS && eval $SERVER_PORT;then
  echo "$SERVER is running"
else
  echo "$SERVER is not running"
fi
. /etc/init.d/functions
function service_status(){
if (($#!=1));then
  echo $"Usage: sh $0 servicename" && exit 1
else
  SERVER="$1"
fi
SERVER_PROCESS="ps -ef |grep -v grep |grep $SERVER &> /dev/null"
SERVER_PORT="ss -lntup |grep $SERVER &> /dev/null"
if eval $SERVER_PROCESS && eval $SERVER_PORT;then
  action "$SERVER is running" /bin/true
else
  action "$SERVER is not running" /bin/false

fi
}
service_status $1

判断是否为IP地址

function check_ip(){
  IP=$1
  if [[ $IP =~ ^([0-9]{1,3}\.){3}[0-9]{1,3}$ ]];then
    echo $IP |awk -F "." '{if($1<=255&&$2<=255&&$3<=255&&$4<=255){print $0 " is available"} else {print $0 " is not available"}}'
  else
    echo "$IP not available !"
  fi
}

check_ip $1

写一个猜数字脚本,当用户输入的数字和预设数字(随机生成一个0-100的数字)一样时,直接退出,否则让用户一直输入,并且提示用户的数字比语塞数字大或者小

#!/bin/bash
random=$((RANDOM%100+1))
while true;do
  read -p "请输入一个数字: " num
  [[ $num =~ ^[0-9]+$ ]] || exit 1
  ((i++))
  if [ $num -gt $random ];then
     echo "猜大了"
  elif [ $num -lt $random ];then
     echo "猜小了"
  else
     echo "恭喜你,猜中了!"
     echo "一共猜了$i次"
     break
  fi
done

用Shell实现,把一个文本文档中只有一个数字的行给打印出来

egrep '^[^0-9]*[0-9][^0-9]*$' test.txt

计算1到100的和

for i in {1..100};do
  ((sum+=i))
done
echo $sum

扫描网络内存活主机

#!/bin/bash

SUBNET="192.168.8.0"
[ -f ping_ok.txt ] && rm ping_ok.txt -f
[ -f ping_fail.txt ] && rm ping_fail.txt -f
for IP in ${SUBNET%?}{1..254};do
{
  NUM=0
  while ((NUM<3));do
    if ping -c 1 $IP &> /dev/null;then
      echo $IP  >> ping_ok.txt
      break
    else
      ((NUM++))
      if ((NUM==3));then
        echo $IP  >> ping_fail.txt
      fi
    fi
  done
}&
done
wait
echo ping finish...

MySQL数据库分库分表备份

#!/bin/bash
source /etc/profile
mysqlUser=root
mysqlPass=`cat /etc/myp`
exDataBase='_schema|Database'
dataBase=`mysql -u$mysqlUser -p$mysqlPass -e "show databases;" 2> /dev/null |egrep -v "$exDataBase"`
Time=`date +%F`
backDir=/application/backup/$Time
[ -d $backDir ] || mkdir -p $backDir
mysqladmin -u$mysqlUser -p$mysqlPass flush-logs 2> /dev/null
for DB in $dataBase
do
  mkdir -p $backDir/$i
  tablelist=`mysql -u$mysqlUser -p$mysqlPass -e "show tables from $i" 2> /dev/null |grep -v Tables_in`
  for TABLE in $tablelist
  do
    mysqldump -u$mysqlUser -p$mysqlPass --master-data=2 --single-transaction --triggers -R $DB $TABLE 2> /dev/null |gzip > $backDir/$i/$i-$t-${Time}.sql.gz
  done
done

打印99乘法表

#!/bin/bash
for ((i=1;i<=9;i++));do
  for ((j=1;j<=i;j++));do
    echo -ne "$j*$i=$((j*i))\t"
  done
  echo
done

批量创建用户

colorString

function echo_color_string() {
  local color_set="red|green|yellow|blue|sblue|purple|white"
  if [ $# -ne 2 ];then
    echo $"Usage: sh $0 {$color_set} string"
    exit 1
  fi
  if [ -z "$1" -o -z "$2" ];then
    echo '$1 or $2 is null'
    exit 2
  fi
  if [[ "$1" =~ ^(red|green|yellow|blue|sblue|purple|white)$ ]];then
    local color="$1"
    local string="$2"
    local red="\033[31m"
    local green="\033[32m"
    local yellow="\033[33m"
    local blue="\033[34m"
    local purple="\033[35m"
    local sblue="\033[36m"
    local white="\033[37m"
    local c_reset="\033[0m"
    eval echo -e "\${${color}}${string}\${c_reset}"
  else
    echo "\$1 = {$color_set}"
  fi
}
#!/bin/bash

. /etc/init.d/functions
. ./colorString

USER_FILE=user.txt
PREUSER="wuxing"
PASS="123456"
if (($#!=1));then
  echo $"Usage: sh $0 userpre" && exit 1
else
  PREUSER="$1"
fi
for USER in ${PREUSER}{1..3};do
  if ! id $USER &> /dev/null;then
    PASS="$(openssl rand -base64 20 |cut -c1-10)"
    useradd $USER && echo $PASS |passwd --stdin $USER &> /dev/null
    echo -e "${USER}\t${PASS}" >> user.txt
    RETVAL=$?
    if [ $RETVAL -eq 0 ] ;then
      action "create $USER success..." /bin/true
    else
      action "create $USER faild!" /bin/false
    fi
  else
    echo_color yellow "$USER is exist!"
  fi

done

输入5个100以下的数字,统计和,最小值和最大值

#!/bin/bash
COUNT=0
while ((COUNT<5));do
  read -p "please input a num (1-100): " NUM
  if [[ ! $NUM =~ ^[0-9]+$ ]];then
    echo "input must num"
    exit 1
  elif [ $NUM -gt 100 ];then
    echo "input must 1-100"
    exit 1
  fi
  if ((COUNT==0));then
    MIN=$NUM
    MAX=$NUM
  fi
  SUM=$(($SUM+$NUM))
  ((NUM<MIN)) && MIN=$NUM
  ((NUM>MAX)) && MAX=$NUM
  let COUNT++
done
echo "SUM: $SUM"
echo "MIN: $MIN"
echo "MAX: $MAX"

求几个数中的最大值

#!/bin/bash
function compare(){
  if (($1>=$2));then
    echo $1
  else
    echo $2
  fi
}

read -p "please input n num: " -a NUM
MAX=$(compare ${NUM[0]} ${NUM[1]})
for ((i=2;i<${#NUM[*]};i++));do
  MAX=$(compare $MAX ${NUM[i]})
done
echo $MAX

message

. /etc/init.d/functions
function Msg(){
  if [ $? -eq 0 ];then
    action "$1" /bin/true
  else
    action "$1" /bin/false
  fi
}

统计每个字母的个数

1.txt

m
m
f
f
f
m
m
m
m
f
m
f
m
#!/bin/bash
declare -A count
while read line
do
   let count[$line]++
done < 1.txt
for i in ${!count[*]}
do
   echo $i ${count[$i]}
done

1、按单词出现频率降序排序 2、按字母出现频率降序排序!

the squid project provides a number ofresources to assist users design,implement and support squid installations.Please browse the documentation and support sections for more infomation,byoldboy training.
awk -F "[^a-zA-Z]+" '{for (i=1;i<NF;i++){a[$i]++}}END{for (x in a) print a[x],x}' test.txt
tr -d ',.' <test.txt |awk -F "" '{for (i=1;i<NF;i++){a[$i]++}}END{for (x in a) print a[x],x}'

生成0-100之间的随机数,并相加,直到大于1000,输出相加的结果, 并判断最后一个随机数字能否被3整除

sum=0
while ((sum<=1000))
do
  random=$((RANDOM%101))
  ((sum+=random))
done
echo $sum
if ((random%3==0));then
   echo $random 能被3整除
else
   echo $random 不能被3整除
fi

Rsync服务启动脚本

#!/bin/bash
# chkconfig: 2345 64 36
# description: manager rsyncd server.
 
# Warning: This script uses the /etc/init.d/functions system function. 
#          System  kernel version is CentOS6.6,2.6.32-504.el6.x86_64.
#          I'm not sure whether other systems can be used normally.
# Source function library.
. /etc/init.d/functions
 
rsync=/usr/bin/rsync
prog=rsyncd
pidfile=${PIDFILE-/var/run/rsyncd.pid}
lockfile=${LOCKFILE-/var/lock/subsys/rsyncd}
RsyncConf="/etc/rsyncd.conf"
RETVAL=0
 
Usage(){
$SETCOLOR_WARNING 
echo -n "Rsync Daemon Program Need Configuration File,like /etc/rsyncd.conf"
$SETCOLOR_NORMAL
echo
exit 6
}

start(){
[ -x $rsync ] || exit 5
[ -f $RsyncConf ] || Usage
        echo -n $"Starting $prog: "
        daemon --pidfile=${pidfile} $rsync --daemon
        RETVAL=$?
        echo
        [ $RETVAL = 0 ] && touch ${lockfile}
        return $RETVAL
}
 
stop(){
echo -n $"Stopping $prog: "
killproc $prog
retval=$?
echo
[ $retval -eq 0 ] && rm -f ${lockfile}
return $retval
}
 
restart() {
stop
sleep 1
start
}
 
rh_status() {
status $prog
}
 
rh_status_q() {
rh_status >/dev/null 2>&1
}
 
case "$1" in
    start)
        rh_status_q && exit 0
        $1
        ;;
    stop)
        rh_status_q || exit 0
        $1
        ;;
    restart)
        $1
        ;;
    status)
        rh_status
        ;;
    *)
        echo $"Usage: $0 {start|stop|status|restart}"
        exit 2
esac

脚本初始化

function scripts_init(){
  prog=`basename $0`
  LockFile=/var/lock/subsys/${prog}.lock  # 使用锁文件
  LogFile=/var/log/${prog}.log  # 脚本记录日志
  PidFile=/var/run/${prog}.pid  # 记录进程号,可以管理脚本

  [ -f $LockFile ] && echo "There $LockFile is exist!!" && exit 1 ||touch $LockFile
  [ ! -f $LogFile ] && touch $LogFile
  [ -f $PidFile ] && echo "There $PidFile is exist!!" && exit 2|| echo $$ > $PidFile
}

记录日志

function writelog(){
  Date=$(date "+%F_%T")
  ShellName=`basename $0`
  Info=$1
  echo "$Date : ${ShellName} : ${Info}" >> ${LogFile}
}

脚本退出扫尾

function closeout(){
  [ -f $LockFile ] && rm -f $LockFile 
  [ -f $PidFile ]&& rm -f $PidFile
}

编写正(或长)方形图形

#!/bin/bash
read -p "please enter a number:" Line
for x in `seq $Line`
do
    for y in `seq $Line`
    do
        echo -n "* "
    done
    echo
done
#!/bin/bash
read -p "please enter a number:" chang kuan
for x in `seq $kuan`
  do
    for y in `seq $chang`
      do
        echo -n "* "
    done
    echo
done

编写等腰三角形图形字符

#!/bin/bash
read -p "Please Enter a number:" Line
for ((i=1; i<=Line; i++))
do
    for ((j=$Line-$i; j>0; j--));
    do
        echo -n ' '
    done
    for ((h=1; h<=$((2*$i-1)); h++))
    do
        echo -n '*'
    done
    echo
done

编写直角梯形图形字符

#!/bin/sh
if [ $# -ne 2 ];then
    echo $"USAGE:$0 num1(>2) num2"
    exit 1
fi
for n in `seq $1 $2`
do
    for((m=1;m<=$n;m++))
    do
        echo -n "*"
    done
    echo
done

30道shell编程题目中给每个伙伴随机抽取10道题目

#!/bin/bash
function input(){
  read -p "请输入题目总数:" S_count
  read -p "请输入选题数量:" count
  read -p "请输入组的数量:" team
}

function RAN_one(){
  tmp_num=`echo $((RANDOM%$S_count+1))`
  i=0
  while ((i<${#num[*]}))
  do
    if ((tmp_num!=num[i]))
    then
      ((i++))
    else
      i=0
      tmp_num=`echo $((RANDOM%$S_count+1))`
    fi
  done
  num[${#num[*]}]=$tmp_num
}

function RAN(){
count=$1
num[0]=`echo $((RANDOM%$S_count+1))`
for((j=1;j<count;j++))
do 
  RAN_one
done
echo ${num[*]}
}


function main(){
  clear
  input
  for ((i=1;i<=team;i++))
  do
    echo $i ------ $(RAN $count)
  done
}
main
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wuxingge

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值