接到了需要修改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"a′sarg: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"b′sarg:OPTARG"
;;
c)
echo “c’s arg:$OPTARG”
;;
?) #当有不认识的选项的时候arg为?
echo “unkonw argument”
exit 1
;;
done
一些常见错误
- 执行shell出现:没有那个文件或目录
set ff=unix
#下面是从服务器上删除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