计算器
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