shell脚本日常应用总结


方便以后翻查,持续更新…

更新日期:2021-09-01

1、 日期循环执行脚本框架

1.1、 架构,三大部件

  1. 判断输入参数格式,传递日期
  2. 循环传入的日期周期
  3. 执行方法体

架构框架代码

syn_table_data.sh

#!/bin/bash
#以下3个部件,第一部件,判断输入参数格式,传递日期,第二部件,循环传入的日期周期。第三部件:执行方法体
#传入的时间格式:年月日 %Y%m%d 如:20200101 20200201 
#完整的执行脚本两种。有参,循环区间包含输入输入参数的那天
#第一种有参:bash /data/script/excute.sh 20200101 20200201 
#第二种无参:bash /data/script/excute.sh
current_time=`date +"%Y-%m-%d %H:%M:%S"`
param_one=$1
param_two=$2
log_path=/data/log/daily_script/`echo ${current_time:0:10} |sed s/-//g `
mkdir -p ${log_path}
#3.执行方法体,也可以变为调用外部脚本
function excute_method(){
	echo "back_sql excute_date=${excute_date}"
	/data/script/syn_table_data_children.sh ${excute_date}
}
#2.日期循环
function foreach_method(){
    echo "foreach_method param_method=${param_method} start_date=${start_date} end_date=${end_date}"
    while [ ${start_date} -le ${end_date} ]
    do
    	excute_date=`date -d "${start_date}" +%Y-%m-%d`
    	excute_method
    	start_date=`date -d "-1 days ago ${start_date}" +%Y%m%d`
    done
}
#1.校验参数
if [ -z "${param_one}" ]
then
        yesterday_time=`date -d "-1 days" +%Y%m%d`
        #start_date=`echo ${current_time:0:10} |sed s/-//g `
        #end_date=`echo ${current_time:0:10} |sed s/-//g`
        start_date=${yesterday_time}
        end_date=${yesterday_time}
        param_method=dailyExcute
        foreach_method
else
        start_date=${param_one}
        end_date=${param_two}
echo "=========${start_date} ${end_date} current=`date +%Y%m%d%H%M`============"
        if [[ ${start_date} > ${end_date} ]]
        then
                echo "the first param  must less than second param. "
                exit 0
        else
                current_date=`date +%Y%m%d%H%M`
                if [[ ${end_date} > ${current_date} ]]
                then
                        echo "the second param  must less today. second_param:${end_date} today:${current_date} "
                        exit 0
                else
                		param_method=historyExcute
                        foreach_method
                fi
        fi
fi

执行方法,还有注意信息

  • 传入的时间格式:年月日 %Y%m%d 如:20200101 20200201
  • 完整的执行脚本两种。有参,循环区间包含输入输入参数的那天
    • 第一种有参:bash /data/script/excute.sh 20200101 20200201
    • 第二种无参:bash /data/script/excute.sh

syn_table_data_children.sh

#!/bin/bash
param_one=$1
mkdir -p /data/sql/big_data/general_pay/
mysqldump -uroot -padmin -t test user --where="name='tcl' and date='2020-02-02'" --triggers=false > /data/sql/big_data/general_pay/2020-02-02.sql

1.2、 获取时间

date=`date +"%Y-m-d %H:%M:%S"`

1.3、 格式化/赋值对象时间

  • 命令

    • 添加“-d”参数
  • 实例

    date=20200202
    turn_date=`date -d ${date} +"%Y-%m-%d"`
    echo "date=${date} turn_date=${turn_date} "
    #在命令台的测试命令,用分号隔开就好,
    #date=20200202;turn_date=`date -d ${date} +"%Y-%m-%d"`;echo "date=${date} turn_date=${turn_date} "
    

2、 读取文件方法

2.1、while方法

  • 语法

    while read line
    do
    	echo "${line}"
    done < ${file_path}
    
    
  • 实例

    #!/bin/bash
    param_one=$1
    mkdir -p /data/sql/big_data/general_pay/
    file_path=/data/script/read_data/
    file_name=data_table.csv
    #read file
    while read line
    do
    	#echo "==$line"
    	#save base value
    	OLD_IFS="$IFS"
    	#change value
    	IFS=","
    	arr=($line)
    	#Restore value
    	IFS="$OLD_IFS"
    	echo "这里可以使使用数组循环得到,one=${arr[0]} two=${arr[1]} three=${arr[2]} four=${arr[3]}"
    done < ${file_path}${file_name}
    

3、 数组

3.1、 创建数组

array=(1 2 3)

3.2、 数组遍历

  • 标准模式

    • 语法

      for(( i=0;i<${#array[@]};i++)) do
      #${#array[@]}获取数组长度用于循环
      echo ${array[i]};
      done;
      
    • 示例

      read_database_name_array=(big_data data)
      #read file
      for (( i=0; i<${#read_database_name_array[@]}; i++ ))
      do
              echo ${read_database_name_array[i]}
      done
      exit 0
      

4、 字符串

4.1、 字符串替换

4.1.1 sed方法

  • 语法

    • sed s/source/new/g
    • g表示替换全部。
  • 实例

    • 替换字符串
    str="1234455"
    str=`echo ${str}|sed s/4/9/g`
    
    • 替换文件,加i

      • 替换里面的文件内容4,改为10。
      sed -i 's/4/10/g' test.txt
      

4.1.x 特殊字符串

  • 比如^M
    • 人工输入的话不能直接按和M,要按三个快捷键Control+v+m才可以。要输入A也是一样的操作:Ctrl+v+A
    • 去除命令:
      • status=echo ${arr[3]}| sed 's/^M//g'
      • status=echo ${arr[3]}| tr -d '^M'

4.2字符串分割

4.2.1、 IFS

  • 实例

    while read line
    do
    	#echo "==$line"
    	#保存IFS原始值
    	OLD_IFS="$IFS"
    	#改变IFS值,此值是文件的分隔符,csv用的是英文逗号(,)
    	IFS=","
    	#切割字符串
    	arr=($line)
    	#还原IFS值
    	IFS="$OLD_IFS"
    	echo "one=${arr[0]} two=${arr[1]} three=${arr[2]} four=${arr[3]}"
    done < ${file_path}${file_name}
    

4.2.2 使用字符串里面的变量分割

  • 实例

    获取年月日

    excute_date="2020-01-04 10:13:32"
    excute_date_str=(${excute_date// / })
    excute_date=${excute_date_str[0]}
    echo "date=${excute_date}"
    #---逗号分割--
    excute_date="1,2,3,5"
    excute_date_str=(${excute_date//,/ })
    excute_date=${excute_date_str[0]}
    echo "date=${excute_date}"
    

4.3、 字符串长度

str="abc"
str_length=${#str}

5、 算法

5.1、 加法

a=0
a=`expr $a + 1`

6、解压缩

6.1、 tar命令

  • 解压

    • 语法

    • 实例

      tar -zcvf tar_name.tar.gz target_folder
      
  • 压缩

    • 语法

      • -c folder_path 解压到指定目录用:-C
    • 实例

      tar -zxvf tar_name.tar.gz -C folder
      

7、 VIM

7.1、 替换某个字符串

  • 语法

    • g 表示全局替换,没有g的话表示只替换发现的首个。
  • 实例

    把文件里面的所有foo替换成bar

    :%s/foo/bar/g
    

7.2、 查找某个字符串

  1. 按键盘最右边上面的Esc键

  2. 按键盘/输入你要查找的字符串

  3. 按回车键

  4. 查找下一个按键盘小写n键

  5. 查找上一个按键盘大写N键

    • 查找实例

7.3、 显示行数

  • 语法

    se nu
    

8、 传输

8.1、 scp

  1. 在A服务器把在A服务器的文件(file)从A传到B服务器

    • 语法

      • 传输文件:scp file target_user@target_ip:target_floder
      • 传输目录包含子目录和文件:scp -r floder target_user@target_ip:target_floder
    • 实例

      scp A.file root@192.*.*.*:/data/
      
  2. 在A服务器把在B服务器的文件从B传到A服务器

    • 语法

    • 实例

      scp root@192.*.*.*:/data/B.file /home/
      

9、 打印目录下的文件夹或者文件

9.1、 for循环

  • 实例

    function read_file(){
            read_file_path=/data/sql/
            cd ${read_file_path}
            for table in `ls`
            do
                    echo "read_file_path=${read_file_path} tabel_name=${table} "
            done
    }
    

10、mysql

10.1、 执行mysql语句

mysql_server=192.168.3.123
mysql_port=3378
mysql_account=root
mysql_password=admin
log_path=/data/log/sql/
log_file=`date +"%Y-%m-%d"`.log
##EOF之间就类似mysql登录后的命令台。
function sql_excute(){
echo "sql_excute_start_time=`date +"%Y-%m-%d %H:%M:%S"` ">> ${log_path}${log_file}
mysql -h${mysql_server} -P${mysql_port} -u${mysql_account} -p${mysql_password} <<EOF
use ${database};
select * from ${table} limit 3;
EOF
echo "sql_excute_end_time=`date +"%Y-%m-%d %H:%M:%S"` ">> ${log_path}${log_file}
}

10.2、 导出mysql数据

10.2.1 根据条件导出mysql文件。mysqldump

  • 使用mysqldump根据条件导出数据

    • 语法

      mysqldum -u${account} -p${password} -t ${database} ${table} --where="1=1" --triggers=false >${export_file} 
      
    • 实例

      mysqldump -uroot -padmin -t test user --where="name='tcl' and date='2020-02-02'" --triggers=false > /data/sql/test/user/20200202.sql
      

11、 语句

11.1、 case

  • 实例:调用一个脚本,传递一个参数,执行符合参数里面的程序。比如我要编写个脚本控制远程服务器的某个服务启动,或者关闭。
#!/bin/bash
case $1 in
"start"){
        for  i in a b c
        do
                echo "$i"
        done
};;
"stop"){
        for  i in 1 2 3
        do
                echo "$i"
        done
};;
esac
  • 注意点:
    • 每个case一定要分号(;;)结尾,前面的分号表示大括号())结尾,后面的是响应括号(})结尾。
    • case后面结尾一定要加esac。要不会提示:syntax error: unexpected end of file

12 xargs

12.1 执行打包目录下所有文件,用当前文件夹或者文件命名

##脚本内容file_tar.sh
cd /data/product
ls |xargs -i tar -zcvf {}.tar.gz {}
##执行
sh file_tar.sh

12.2 解压当前目录下所有压缩包

ls /data/tar/20210101/*.tar.gz | xargs -n1 tar xzvf

12.3 删除含有某个关键字的进程

 ps ax|grep wireless|awk '{print $1}'|xargs kill
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值