首页 > 系统相关 >shell脚本示例

shell脚本示例

时间:2023-10-20 17:25:03浏览次数:36  
标签:脚本 bin shell 示例 echo done fi awk

目录

1. 编写脚本技巧

#!/bin/bash
#date: yyyy-mm-dd
#author: shaochong

#启用环境变量
source /etc/profile
export PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/apps/bin/"

#set -xe  # x:显示执行脚本详情 e:状态码非0退出脚本

#脚本中使用到未声明变量时退出脚本
#set -o nounset 或 set-u

#readonly声明静态变量,即定义后无法修改
#readonly Ftp_dir=/data/ftp_dir


#cd `dirname $0`

2. 脚本:color

#!/bin/bash
Red='\E[1;31m'
Green='\E[1;32m'
Yellow='\E[1;33m'
Blue='\E[1;34m'
Pink='\E[1;35m'
Res='\E[0m'

usage()
{
echo "USAGE:$0 {red|green|yellow|blue|pink}" contents && exit 1
}

color()
{
case $1 in
  "red")
   echo -e "${Red}$2 ${Res}";;
  "green")
   echo -e "${Green}$2 ${Res}";;
  "yellow")
   echo -e "${Yellow}$2 ${Res}";;
  "blue")
   echo -e "${Blue}$2 ${Res}";;
  "pink")
   echo -e "${Pink}$2 ${Res}";;
   *)
   usage
   ;;
esac
}

main() 
{
if [ $# -ne 2 ];then
    usage
fi
    color $1 $2
}
main $*


3. 脚本:for循环嵌套

# mkdir -p /data/{2018..2020}/{1..12}/{1..31}

'''
#!/bin/bash
#date:2020/08/11
#author:shao
#for循环嵌套统计每个年份目录下的每个月份目录下的每天的目录文件数量
File=/tmp/shao.txt
[ ! -s $File ] || > $File

PaTh=/data
for Year in {2018..2020};do
  for Month in `ls $PaTh/$Year`;do  
    cd $PaTh/$Year/$Month
    for Day in `ls`;do
      echo "[ $Year-$Month-$Day ]" >> $File
      ls $Day | wc -l >> $File
    done
  done
done
'''

4. 脚本:检测网址联通性

#!/bin/bash
#检测网址连通性
[ -f /etc/init.d/functions ] && . /etc/init.d/functions
array=(
http://www.baidu.com
http://www.taobao.com
http://www.google.com
http://www.51cto.com
http://10.0.0.1
)
wget_ip() {
wget -T 5 -t 1 --spider --no-check-certificate $1 &> /dev/null
return $?
}
main() {
for i in ${array[*]}
do
    wget_ip $i
  if [ $? -eq 0 ];then
    action "curl $i" /bin/true
  else
    action "curl $i" /bin/false
  fi
done
}
main

5. 脚本:密钥分发

#!/bin/bash
#批量分发密钥
#by: Shaochong
#ssh-keygen -t rsa  -f ~/.ssh/id_rsa -P ""
Port=2200
User=root
Passwd=abc123
for ip in 192.168.1.{10..20};do
    ping -c2 $ip &> /dev/null
    if [ $? -ne 0 ];then
        echo "$ip is down"
        continue
    else
        echo "$ip is up"
        sshpass -p $Passwd ssh-copy-id -i -p $Port "-o StrictHostKeyChecking=no" $User@$ip  &> /dev/null
        if [ $? -eq 0 ];then
            echo "$ip 分发公钥secceed"
        else
            echo "$ip 分发公钥failed"
        fi
    fi
done

6. 生产脚本:TCP连接数监控-统计TCP11种状态连接数

#!/bin/bash
#date:   20191212
#author: shaochong
usage()
{
echo "Usage $0 {key}" && exit 1
}

tcp_connect()
{
SUM=$(ss -ant | awk 'NR>1 {++s[$1]} END {for(i in s) print i,s[i]}' | grep -i $1  2> /dev/null | awk '{print $2}')

rpm -qa | grep iproute &> /dev/null
[[ $? -eq 0 ]] || exit 2

if [ ! -z $SUM ]
   then
       [ $# -eq 1 ] && echo $SUM || usage
   else
       [ $# -eq 1 ] && echo 0 || usage
fi
}

tcp_connect $*

7. 生产脚本:日志监控-检查日志刷新时间

#!/bin/bash

#Servertime
Year=`date +%Y`
Month=`date +%m`
Day=`date +%d`

#Logtime
Logtime_Year=$(stat $1 | awk -F"(:|-| )" '/Change:/{print$3}')
Logtime_Month=$(stat $1 | awk -F"(:|-| )" '/Change:/{print$4}')
Logtime_Day=$(stat $1 | awk -F"(:|-| )" '/Change:/{print$5}')


#Operation
Month_Value=$(echo $Month $Logtime_Month | awk '{print $1-$2}')
Day_Value=$(echo $Day $Logtime_Day | awk '{print $1-$2}')

#判断年份是否相同
if [ $Year -eq $Logtime_Year ]
  then :
else
  echo 1
  exit 1
fi

#判断月份是否相差一个月之内
if [ $Month_Value -le 1 ]
  then :
else
  echo 2
  exit 2
fi

#判断日期是否相差三天之内
if [ $Day_Value -le 2 -a $Day_Value -ge 0 -a $Month -eq $Logtime_Month ]
  then echo 0
elif [ $Day_Value -le -27 -a $Day_Value -ge -30 ]
  then echo 0
else 
  echo 3
fi

8. 生产脚本-mq队列监控

#!/bin/bash
#set crontab (rabbitmqctl list_quenens > /tmp/rabbitmq_queues.txt)
File=/tmp/rabbitmq_queues.txt
Queue_Num=$(awk 'NR>3' $File | grep $1 2>/dev/null | awk '{print $2}')
Queue=$(awk 'NR>3' $File | grep $1 2>/dev/null | wc -l)
if [ ${#Queue_Num} -eq 1 -a $Queue -eq 1 ];then
    echo $Queue_Num
else
    echo "Usage $0 (Type the correct value)"
fi

9. 脚本:处理ftp文件

'''
#!/bin/bash
declare -A ftp_cfg
ftp_cfg=([IP]="127.0.0.1" [PORT]="21" [USER]="test1" [PASSWORD]="abc@123" [FTP_DIR]="/var/ftp/test1"  [HOST_DIR]="/tmp/ftp_dir/upload_ftp")
nowTime=$(date +"%F %T")               
logFileName="$(date +%F).txt"          
logFilePath="/tmp/ftp_dir/ftp_logs"

sendFileToFtp()
{
  ftp -n << EOF
  open ${ftp_cfg[IP]} ${ftp_cfg[PORT]}
  user ${ftp_cfg[USER]} ${ftp_cfg[PASSWORD]}
  cd   ${ftp_cfg[FTP_DIR]}
  binary
  lcd  ${ftp_cfg[HOST_DIR]}
  put  $1 $2
  rename $2 $3
  close
  bye
EOF
}

operateFile()
{
  FileArry=$(ls ${ftp_cfg[HOST_DIR]})
  touch $logFilePath/$logFileName
  cd ${ftp_cfg[HOST_DIR]}
  for file in ${FileArry[*]};do
    echo $file | egrep '.now|.done'
    if [ $? -ne 0 ];then
      doneFileArray[i]="$file"
      let i++
      mv $file "$file.done"
      echo -e "[ ${nowTime} ]\t name file name $file to $file.done" >> $logFilePath/$logFileName
    else
      echo "not done file $file"
    fi
  done
  for file in ${doneFileArray[*]};do
    sendFileToFtp "$file.done" "$file.now" $file
    echo -e "[ ${nowTime} ]\t send file $file to ${ftp_cfg[FTP_DIR]}" >> $logFilePath/$logFileName
  done
}
operateFile
'''

#用途:
将本地路径下不包含后缀".done|.now"的文件 先增加后缀".done",然后上传到将".done"文件上传到ftp命名后缀改为".now",然后将后缀去掉

10. 脚本:数组案例

# 随机生成10个数字,并打印最大的数字
'''
#!/bin/bash
for I in {0..9};do
  ARRAY[$I]=$RANDOM
  echo -en "${ARRAY[$I]}\t"
#  sleep 1
done

declare -i MAX=${ARRAY[0]}
INDEX=$[${#ARRAY[*]}-1]

for I in `seq 1 $INDEX`;do
  if [ $MAX -lt "${ARRAY[$I]}" ];then
    MAX=${ARRAY[$I]}
  fi
done
echo -e "\n\nMax_Num:$MAX"
'''


# 交互输入,根据输入输出指定个数的数字,并不重复
#declare -i xxx //声明整数型变量
#declare -r xxx //设置变量为只读
#declare -a xxx //声明数组变量
'''
#!/bin/bash
declare -i NUM
declare -a ARRAY

usage()
{
echo "USAGE:$0 num range_num(num Is not greater than range_num)" && exit 1
}

check() 
{
  for num in `seq 1 ${#ARRAY[*]}`;do
    if [ "$1" -eq "${ARRAY[$num]}" ];then
      return 1
    fi
  done
}

output() 
{
for i in `seq 1 $1`;do
  while true;do
    NUM=$[$RANDOM%$2+1]
    check $NUM
    [[ $? -eq 0 ]] &&  break
  done
  ARRAY[$i]=$NUM
  echo "${ARRAY[$i]}"
done
}

main()
{ 
if [ $# -ne 2 -o $1 -gt $2 ];then 
  usage
else
   output $1 $2
fi
}

main $*


11. while read line判断两个文件夹相同的文件并打包

#!/bin/bash
Src=source
Dst=dest
[ ! -d $Src -o ! -d $Dst ] && exit 1

find ./$Src -type f | awk -F"$Src/" '{print $2}' > source.txt
find ./$Dst -type f | awk -F"$Dst/" '{print $2}' > dest.txt

while read i;do
  while read q;do
    if [ "$(md5sum source/$i | awk '{print $1}')" = "$(md5sum dest/$q | awk '{print $1}')" ];then
      echo $Dst/$i >> bak.txt
    fi
  done < source.txt
done < dest.txt

tar zcvf backup.tar.gz `cat bak.txt`
rm -f bak.txt source.txt dest.txt

标签:脚本,bin,shell,示例,echo,done,fi,awk
From: https://www.cnblogs.com/ican97/p/17777552.html

相关文章

  • shell并发
    目录1.for循环执行任务2.全并发执行任务3.并发控制1.for循环执行任务一个for循环1000次顺序执行1000次任务#!/bin/bashstart_time=`date+%s` #定义脚本运行的开始时间for((i=1;i<=1000;i++))dosleep1 #sleep1用来模仿执行一条命令需要花费的时间(......
  • 【PowerShell】Invoke-WebRequest和Invoke-RestMethod
    ##PublicfreeRestfulAPIURL ##https://documenter.getpostman.com/view/8854915/Szf7znEe#intro#Example01#--------------------------------------------------------------$url="https://cat-fact.herokuapp.com/facts/"$r=Invoke-WebReques......
  • 使用Pytorch Geometric 进行链接预测代码示例
    PyTorchGeometric(PyG)是构建图神经网络模型和实验各种图卷积的主要工具。在本文中我们将通过链接预测来对其进行介绍。链接预测答了一个问题:哪两个节点应该相互链接?我们将通过执行“转换分割”,为建模准备数据。为批处理准备专用的图数据加载器。在TorchGeometric中构建一个......
  • shell脚本自动化实战
    Shell脚本自动化部署实战(二)原创 叶凡Jonas 软件测试成长之路 2023-09-0100:00 发表于上海收录于合集#UI自动化系列54个三丶shell语法4.程序结构2.循环结构说明:在上一篇博客中讲到了for循环,现在开始讲解while循环a)格式while[条件]do 命令done示例1:变量......
  • Shell-$(cd "$(dirname "$0")",pwd)
    #!/bin/bashBIN_FOLDER=$(cd"$(dirname"$0")";pwd)echo$BIN_FOLDERPROJECT_FOLDER=$(cd"$(dirname"$BIN_FOLDER")";pwd)echo$PROJECT_FOLDERPYTHON_BIN=$PROJECT_FOLDER/.venv/bin/pythonecho$PYTHON_BINBIN_FOLDER......
  • 以下是一个简单的HTML代码示例,演示如何实现分身份登录(用户登录和管理员登录)
    <!DOCTYPEhtml><html><head><title>分身份登录</title></head><body><h2>用户登录</h2><formaction="user_login.php"method="post"><labelfor="user_username"......
  • 一个更复杂的 PHP 代码示例,我将展示一个购物车系统的基本实现,它包括商品类、购物车类
    一个更复杂的PHP代码示例,我将展示一个购物车系统的基本实现,它包括商品类、购物车类和一些基本的操作方法。<?php//定义商品类classProduct{private$name;private$price;publicfunction__construct($name,$price){$this->name=$name;$this->pri......
  • 25 个超棒的 Python 脚本合集
     Python是一种功能强大且灵活的编程语言,拥有广泛的应用领域。下面是一个详细介绍25个超棒的Python脚本合集:1.网络爬虫:使用Python可以轻松编写网络爬虫,从网页中提取数据并保存为结构化的格式。2.数据清洗和预处理:Python提供了许多库和工具,用于数据清洗、去重、填充缺失值和......
  • Linux shell编程学习笔记8:使用字符串
    一、前言字符串是大多数编程语言中最常用最有用的数据类型,这在Linuxshell编程中也不例外。本文讨论了LinuxShell编程中的字符串的三种定义方式的差别,以及字符串拼接、取字符串长度、提取字符串、查找子字符串等常用字符串操作,,以及反引号在echo和expr命令联合使用时的作用。二......
  • Linux shell编程学习笔记4:修改命令行提示符格式(内容和颜色)
    一、命令行提示符格式内容因shell类型而异Linux终端命令行提示符内容格式则因shell的类型而异,例如CoreLinux默认的shell是sh,其命令行提示符为黑底白字,内容为:tc@box:/$其中,tc为当前用户名,box为主机名,/为当前目录路径,$表示当前用户类型是普通用户 。 二、环境变量PS1存储了命令行提......