shell>初窥门径(由于有了任务才接触到了shell,发现一块新大陆)

接到了需要修改1.sh文件的任务,此文件可以定时删除7天以前的日志文件,但是有几个语句不能执行,需要进行修改。
初接触感觉应该和windows下的.bat文件是差不多的吧


先进行.sh文件的学习,有几篇教程写的不错:1.from简书

基础内容

#指定程序使用哪个解释器,#是注释  #!不是注释
#!/bin/bash

#echo(响应)可以理解为printf
echo "My Script!"

#定义一个变量,变量区分大小写,使用前需要在变量前机上$
SHELL_NAME="bash"
echo "The Shell Is $SHELL_NAME ,Or Shell Is ${SHELL_NAME}"

#接收键盘输入,可以有提示信息,储存在USER_NAME中
read -p "输入用户名:" USER_NAME

#测试比较语句用[ -e /etc/passwd ],测试语句多用于条件判断,有特定的文件/字符串/算数测试操作 
#条件判断语句,if-elif-else-fi
STRING1="abc"
STRING2="abc"
if [ $STRING1 = $STRING2 ]
then
	echo "STRING1 is same with STRING2"
elif [ $STRING1 != $STRING2 ]
then
	echo "STRING1 is not same with STRING2"
else
	echo "nothing"
fi

#case语句,当判断很多使用if不方便时使用case
#使用\转义字符
read -p "输入密码" PASSWORDE
case "$PASSWORDE" in
	a)
	echo "ah!your passworde is \"a\""
	;;
	b)
	echo "ah!your passworde is \"b\""
	;;
	c)
	echo "ah!your passworde is \"c\""
	;;
esac

#for循环,比如实现所有.txt文件前加new,此外还有while循环 while [  ] \n do \n chommad \n done
#continue 用于结束本次循环 break 用于结束整个循环
FILES=$(ls *txt)
NEW="new"
for FILE in $FILES
do
  echo "reading $FILE to new-$FILE"
  mv $FILE $NEW-$FILE
done

补充内容

  • 执行脚本的时候可以传递参数供脚本内部使用

./script.sh param1 param2.

  • 脚本内部

$0 – “script.sh”
$1 – “param1”
$2 – "param2"

  • 逻辑操作符&& ||

mkdir tempDir && cd tempDir && mkdir subTempDir
#如果创建tempDir成功,执行后面的cd,继续创建subTempDir

  • 函数

function myFunc () {
echo “Shell Scripting Is Fun!”
}
myFunc # call

  • 函数参数传递
    和脚本一样,也可以给函数传递参数完成特殊的任务,第一个参数存储在变量$1中,第二个参数存储在变量 2 中 . . . , 2中..., 2...@存储所有的参数,参数之间使用空格分割 myFunc param1 param2 param3 …
  • 通配符

* 可以通配一个或多个任意字符
? 匹配一个字符
[ ] 匹配括号内部的任意一个字符
[! ] 不匹配括号内的任何字符

  • 调试

-x 它在执行时打印命令和参数。
-e 它代表“出错”。如果命令以非零退出状态退出,这将导致脚本立即退出。
-v 它在读取时打印shell命令/输入行。

#!/bin/bash-xe

  • 测试操作接口
    1.文件操作
    在这里插入图片描述
    2.字符串操作
    在这里插入图片描述
    3.算数操作
    在这里插入图片描述
  • getopts
    使用getopts识别出各个选项之后,就可以配合case来进行相应的操作了。

while getopts “a: b:c” arg #选项后面的冒号表示该选项需要参数
do
case a r g i n a ) e c h o " a ′ s a r g : arg in a) echo "a's arg: argina)echo"asarg:OPTARG" #参数存在 O P T A R G 中 ; ; b ) e c h o " b ′ s a r g : OPTARG中 ;; b) echo "b's arg: OPTARG;;b)echo"bsarg:OPTARG"
;;
c)
echo “c’s arg:$OPTARG”
;;
?) #当有不认识的选项的时候arg为?
echo “unkonw argument”
exit 1
;;
done

一些常见错误
#下面是从服务器上删除7天前的文件的shell
#主要用到了curl、regex
####################################################################################################
#!/usr/bin/env bash
#set -x 

# Defaults
ELASTICSEARCH='http://10.0.0.66:32282'
DATE=$(($(date +"%s")-7*86400))
INDEX_NAME="logstash-20"
LOGFILE=/dev/null

# Validate numeric values
RE_DATE="^[0-9]{10}"

while getopts ":d:e:g:o:h" flag
do
    case "$flag" in
    h)
        usage
        exit 0
        ;;
    d)
        if [[ $OPTARG =~ $RE_DATE ]]; then
        DATE=$OPTARG
        else
        ERROR="${ERROR}Expiration second must be XXXXXXXXXX.\n"
        fi
        ;;
    e)
        ELASTICSEARCH=$OPTARG
        ;;
    g)
        INDEX_NAME=$OPTARG
        ;;
    o)
        LOGFILE=$OPTARG
        ;;
    ?)
        usage
        exit 1
        ;;
    esac
done

# If we have errors, show the errors with usage data and exit.
if [ -n "$ERROR" ]; then
    echo -e $ERROR
    usage
    exit 1
fi

# Get the indices from elasticsearch
INDICES_TEXT=`curl -s "$ELASTICSEARCH/_cat/indices?v" | grep $INDEX_NAME | awk '{print $3}' | sort -r`

if [ -z "$INDICES_TEXT" ]; then
    echo "No indices returned containing '$GREP' from $ELASTICSEARCH."
    exit 1
fi

# If we are logging, make sure we have a logfile TODO - handle errors here
if [ -n "$LOGFILE" ] && ! [ -e $LOGFILE ]; then
    touch $LOGFILE
fi

# Delete indices
declare -a INDEX=($INDICES_TEXT)
    for index in ${INDEX[@]};do
    # We don't want to accidentally delete everything
    if [ -n "$index" ]; then
        INDEX_DATE=$(echo $index | sed -n 's/.*\([0-9]\{4\}\.[0-9]\{2\}\.[0-9]\{2\}\).*/\1/p'| sed 's/\./-/g')
        if [ $DATE -ge $(date -d $INDEX_DATE +"%s")  ]; then
            echo `date "+[%Y-%m-%d %H:%M] "`" Deleting index: $index." >> $LOGFILE
            curl -s -XDELETE "$ELASTICSEARCH/$index/" >> $LOGFILE
        fi
    fi
    done
exit 0
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值