Shell
运维@小兵
技术改变世界
展开
-
遍历执行存放Linux命令的文件,并将命令执行结果保存到一个文本里面
遍历执行存放Linux命令的文件,并将命令执行结果保存到一个文本里面原创 2024-03-12 17:01:44 · 408 阅读 · 0 评论 -
shell脚本统计代码行数
shell脚本统计代码行数原创 2022-09-26 14:45:57 · 921 阅读 · 0 评论 -
shell脚本控制jar包启停
shell脚本控制jar包启停原创 2022-09-09 16:39:04 · 625 阅读 · 1 评论 -
shell脚本检查k8s Pod是否更新成功
rancher kubectl get pod -n ${k8sNamespace} | grep Evicted | awk '{print \$1}' | xargs -i rancher kubectl delete pod {} -n ${k8sNamespace}num=0 while [[ ${num} -lt 60 ]] do echo "INFO:Begin Upgrade ${serviceName},Please Wait..." sleep 10 p原创 2021-12-28 11:30:13 · 1364 阅读 · 0 评论 -
shell检查文件的大小
#检查文件的大小Check_File_Size(){ local file_name=$1 local file_size=$2 #设置包的最小值,1024代表1M,524288代表512M,1048576代表1G,2097152代表2G [[ ! -f ${file_name} ]] && Log ERROR "${file_name} Not Found" && exit 1 if ! echo ${file_size} |原创 2021-11-18 16:31:51 · 5001 阅读 · 0 评论 -
Shell中$符号的各种含义和用法,$0, $?, $!
$?最后运行的命令返回的结束代码(0表示正常,其他表示异常)$$shell本身的PID$!shell最后运行的后台进程的PID$*传给shell脚本的所有参数的列表,若$*用"括起来,以"$1 $2 ... $n"形式输出所有参数$@传给shell脚本的所有参数的列表,若$@用"括起来,以"$1" "$2" ... "$n"形式输出所有参数$*和$@的区别$#传给shell脚本的参数个数$0shell脚本本身的文件名$1 ~ $n传给shell脚本的位置参数(以IFS原创 2021-10-23 10:56:03 · 2144 阅读 · 0 评论 -
shell数组详解
参考书籍:《Linux Shell核心编程指南》概述数组是Shell的一种特殊变量,是一组数据的集合,里面的每个数据被称为一个数组元素。当前Bash仅支持一维索引数组和关联数组,Bash对数组的大小没有限制。定义数组索引数组第一种方法array1[0]=aarray1[1]=barray1[2]=c这会得到一个包含三个元素的数组array1第二种方法array2=(a b c)元素之间以空格隔开处理数组直接获取元素的值及数组的信息获取单个元素的值echo ${array原创 2021-03-05 22:24:26 · 22973 阅读 · 0 评论 -
Shell八大扩展详解
一、花括号{}注意:花括号不可以被引号引用echo {a..h}echo {1..9}echo {1..9..2} #1到9,步长为2mkdir -p test/{aa,bb}cp /etc/hosts{,.bak} #利用扩展,备份文件mv /etc/hosts.bak{,hosts_bak} #重命名二、波浪号~波浪号在Shell脚本中默认代表当前用户的家目录echo ~ #显示当前用户的家目录ls ~devops #查看devops用户的家目录~+表示当前原创 2021-05-18 22:56:30 · 1243 阅读 · 2 评论 -
docker容器日志过大怎么办
参考文章:Docker容器日志查看与清理(亲测有效)shell脚本#!/bin/sh# vim:sw=4:ts=4:et<<INFOAUTHOR:运维@小兵DATE:2021-10-21DESCRIBE:清理容器日志SYSTEM:CentOS 7.6.1810WARNING:警告信息MODIFY:INFOset -eDOCKER_STORAGE_PATH="/var/lib/docker"echo "INFO:======== start clean dock原创 2021-10-21 21:03:32 · 3580 阅读 · 0 评论 -
shell脚本创建/删除Oracle用户、表空间
#!/bin/bash<<INFOAUTHOR:运维@小兵DATE:2021-09-13DESCRIBE:如创建/删除用户、表空间、授权SYSTEM:CentOS7/RedHat7WARNING:MODIFY:INFOset -esource /etc/profileDB_IP=$1DB_PORT=$2ORACLE_SVC_NAME=$3DB_ADMIN_USER=$4DB_ADMIN_PWD=$5SQL_CMD="sqlplus ${DB_ADMIN_US原创 2021-09-13 21:06:39 · 335 阅读 · 0 评论 -
Shell编程规范
文章目录一、注释`头部注释``单行注释与多行注释`二、排版规范`1.程序块采用缩进,缩进为4个空格`修改vim中Tab键的距离`2.函数编写``3.命令较长需分行书写,在低优先级操作符处划分新行,用'\'标识``4.一行只写一条语句``5.逻辑运算符&&、||和重定向、管道符前后要留空格``6.一个函数只完成一个功能,且不能超过100行``7.case语句格式``8.注释与上面的代码用空行隔开`三、变量规范`1.变量名由字母、数字、下划线组成, 只能以字母、下划线开头``2.尽量减少全局变量原创 2021-09-12 15:30:37 · 3091 阅读 · 0 评论 -
shell读取Json文件的值
json文件profile.json{ "Mysql_IP":"192.168.1.2,192.168.1.3", "Mysql_Port":"3306", "Mysql_User":"root"}获取数据#第一个管道将每行的逗号去掉;第二个管道去掉{和};第三个管道去掉所有双引号;第四个管道替换第一个:为=号data=$(cat profile.json | sed -r 's/",/"/' | egrep -v '^[{}]' | sed 's/"//g' | sed原创 2021-09-04 15:35:07 · 16331 阅读 · 8 评论 -
Shell脚本批量修改文件目录权限
背景:通过安全扫描发现有很多文件和目录的权限不符合要求,而且把不符合要求的文件和目录统一放到一个文件中。现在要根据文件中的内容去更改对应文件和目录的权限#!/bin/bash# vim:et:ts=4:sw=4:#DATE:2021-08-29#DESCRIBE:修改文件和目录权限,操作日志存放到file_permission.log#MODIFY:[ "$#" -ne 1 ] && echo "eg: bash file_permission.sh /root/scan_fi原创 2021-08-29 16:56:12 · 1818 阅读 · 0 评论 -
shell脚本安装Oracle(rpm版)
参考文章linux安装Oracle11GOracle 设置开机自启动脚本#!/bin/bash# vim:sw=4:ts=4:et<<INFOAUTHOR:运维@小兵DATE:2021-08-28DESCRIBE:一键安装/卸载oracle(rpm版)SYSTEM:CentOS 7.6.1810WARNING:警告信息MODIFY:INFOset -e[[ $# -ne 1 ]] && echo "ERROR:Invalid Param!!!,P原创 2021-08-28 16:49:32 · 885 阅读 · 1 评论 -
shell脚本安装Oracle(docker版)
#!/bin/bash<<INFOAUTHOR:运维@小兵DATE:2021-08-16DESCRIBE:Docker方式安装OracleSYSTEM:CentOS7/RedHat7WARNING:MODIFY:INFOset -eORACLE_PORT="1521"ORACLE_DATA_DIR="/app/oracle/data"ORACLE_CONTAINER_NAME="oracle"HARBOR_USER="admin"HARBOR_PWD="Harbo原创 2021-08-16 19:48:54 · 238 阅读 · 0 评论 -
shell安装mysql(rpm版)
#!/bin/bash<<INFOAUTHOR:运维@小兵DATE:2021-08-07DESCRIBE:rpm方式安装MySQLSYSTEM:CentOS7/RedHat7WARNING:MODIFY:INFOset -esource /etc/profile #避免ansible远程执行shell获取环境变量不一致的问题WORKDIR=$(cd `dirname $0`;pwd) #脚本所在路径echo "Current原创 2021-08-07 21:09:59 · 299 阅读 · 0 评论 -
shell常用判断方法汇总
判断是否为文件[[ -f $1 ]] #是文件为真,不是为假判断是否为目录[[ -d $1 ]] #是目录为真,不是为假判断值是否为空[[ -n $1 ]] #不为空是真,为空是假[[ -z $1 ]] #为空是真,不为空是假判断是否为数字echo $3 | egrep '^[[:digit:]]+$' &> /dev/null #是数字为真,不是为假判断命令是否存在command -v java &> /dev/null #存在为真,不存在原创 2021-08-03 20:51:15 · 2529 阅读 · 0 评论 -
shell脚本安装redis(容器化)
#!/bin/bash<<INFOAUTHOR:运维@小兵DATE:2021-07-08DESCRIBE:Docker方式安装redisSYSTEM:CentOS7/RedHat7WARNING:MODIFY:INFOset -esource /etc/profile #避免ansible远程执行shell获取环境变量不一致的问题WORKDIR=$(cd `dirname $0`;pwd) #脚本所在路径echo "Curr原创 2021-07-08 19:48:22 · 301 阅读 · 0 评论 -
shell脚本安装jdk
#!/bin/bash# vim:sw=4:ts=4:et<<INFOAUTHOR:运维@小兵DATE:2021-07-07DESCRIBE:安装/卸载JDKSYSTEM:CentOS7/RedHat7WARNING:MODIFY:INFOset -eWORKDIR=$(cd `dirname $0`;pwd) #脚本所在路径DATA_DIR="/app" #数据路径JDK_VERSION="1.8.0_161"JD原创 2021-07-07 14:55:42 · 842 阅读 · 0 评论 -
shell脚本安装Docker(rpm版)
#!/bin/bash# vim:sw=4:ts=4:et<<INFOAUTHOR:运维@小兵DATE:2021-01-28DESCRIBE:1、rpm方式安装/卸载Docker,可以指定数据盘作为Docker的存储盘SYSTEM:CentOS7/RedHat7WARNING:MODIFY:INFOset -eWORKDIR=$(cd `dirname $0`;pwd)LOG_PATH=${WORKDIR}/docker.logDOCKER_VERSION="18.原创 2021-06-29 22:49:58 · 274 阅读 · 0 评论 -
shell脚本安装MySQL(Docker版)
#!/bin/bash<<INFOAUTHOR:运维@小兵DATE:2021-06-26DESCRIBE:Docker方式安装MySQLSYSTEM:CentOS7/RedHat7WARNING:MODIFY:INFOset -eMYSQL_PORT="3306"MYSQL_DATA_DIR="/var/mysql"MYSQL_CONTAINER_NAME="mysql"MYSQL_ROOT_PASSWORD="123456"HARBOR_USER="admin"原创 2021-06-26 17:50:34 · 613 阅读 · 0 评论 -
shell脚本实现对Mysql数据库的初始化
#!/bin/bash<<INFOAUTHOR:anqixiangDATE:2021-06-24DESCRIBE:初始化Mysql,如创建用户、schema、授权、导入sqlSYSTEM:CentOS7/RedHat7WARNING:MODIFY:INFOset -eMYSQL_IP=$1MYSQL_PORT=$2MYSQL_ADMIN_USER=$3 #Mysql管理员用户,通常为rootMYSQL_ADMIN_PWD=$4MYSQL_CMD="原创 2021-06-24 18:17:45 · 1204 阅读 · 0 评论 -
Shell实现进度条效果
Shell实现进度条效果原创 2021-06-11 16:34:11 · 1745 阅读 · 1 评论 -
Shell脚本安装Docker(二进制版)
#!/bin/bash# vim:sw=4:ts=4:et<<INFOAUTHOR:运维@小兵<邮箱号>DATE:2021-01-26DESCRIBE:1、二进制方式安装/卸载Docker,可以指定数据盘作为Docker的存储盘 2、如果本地没有Docker二进制包会去官网下载,需确保网络可用SYSTEM:CentOS7/RedHat7WARNING:MODIFY:INFOset -eWORKDIR=$(cd `dirname $0`;pwd)LOG_原创 2021-05-30 09:37:31 · 863 阅读 · 4 评论 -
Shell生成随机数
文章目录一、使用命令生成二、使用设备文件生成三、通过Hash值生成随机数据四、使用进程号生成随机数参考书籍:《Linux Shell核心编程指南》——丁明一一、使用命令生成[root@localhost ~]# uuidgen #生成16进制随机字符串0a7beba9-cb04-4ca0-b303-7a3094e180b7[root@localhost ~]# date +%s #1970-1-1到当前的秒数1621759272[root@localhost ~]# openssl ra原创 2021-05-23 16:48:01 · 3076 阅读 · 0 评论 -
shell脚本批量修改远程主机密码
#!/bin/bash<<INFOSCRIPYT:modify_pwd.shAUTHOR:运维@小兵DATE:2020-11-14DESCRIBE:批量修改远程主机root密码SYSTEM:CentOS7/RedHat7WARNING:1.密码中不能有"$"符号 2.执行脚本的机器与远程主机网络通 3.远程主机原始密码需一致MODIFY:INFO######################定义变量######################USERNAME="r原创 2021-05-23 14:52:37 · 761 阅读 · 0 评论 -
shell字符串处理,解决传入参数有空格的问题
一、以下划线作为分隔符,把元素存入数组,并遍历数组脚本内容#!/bin/basharr=a_b_carray=(${arr//_/ }) #把'_'替换为空,并从此处分隔for((i=0;i<${#array[@]};i++))do echo ${array[i]}done输出结果二、当待处理的字符串中出现空格时会出问题修改arr的值arr="name1,image:tag,docker run --name t1 image_name2,image:tag,do原创 2021-05-14 22:22:42 · 5515 阅读 · 0 评论 -
shell多进程并发导入docker镜像
初级版不足之处:当镜像较多时,会同时启动几百个进程,会突然增大服务器的负载,容易导致系统瞬间崩溃for image in $(ls *.tar)do docker load -i $image &donewaitwait命令后如果以进程号作为参数,则等待该进程结束并返回其状态值。如果没有指定任何参数,则会等待当前shell激活的所有的子进程结束,返回状态为最后一个进程的退出状态。中高级版通过文件描述符和命名管道来控制每次并发的进程数量.下面是每次导入10个镜像#!/bin/b原创 2021-05-12 21:24:41 · 532 阅读 · 0 评论 -
shell脚本配置DNS
#!/bin/bash#设置DNS[[ $# -ne 2 ]] && echo "ERROR:Invalid Param,Please Excute:bash $0 url dns_ip" && exit 1URL=$1DNS_IP=$2http_code=$(curl -k -m 3 -s -o /dev/null -w %{http_code} ${URL})if ! echo ${http_code} | egrep '^[234]' &>原创 2021-05-01 22:39:18 · 862 阅读 · 0 评论 -
Shell通过递归求阶乘
#!/bin/bash#Function:求阶乘Func(){ x=$1 if [[ ${x} -eq 1 ]];then echo "1" else echo "$[$x * $(Func $[$x-1])]" fi}result=$(Func $1)echo "$1的阶乘是:${result}"原创 2021-04-26 22:23:31 · 695 阅读 · 0 评论 -
Shell部署LNMP环境
shell部署LNMP环境原创 2021-04-20 22:28:46 · 358 阅读 · 0 评论 -
shell编程注意事项
不能把函数名管道给tee下面这种写法是有问题的func | tee -a install.log当func函数中的退出码为非0时,整个脚本的退出码等于tee -a install.log的退出码,因此为0原创 2021-04-09 21:08:18 · 180 阅读 · 0 评论 -
shell脚本统计分析Nginx日志
shell脚本统计分析Nginx日志原创 2021-03-15 21:07:16 · 1276 阅读 · 2 评论 -
shell脚本格式化输出/etc/passwd文件内容
#!/bin/bash#IFS定义分隔符(临时修改,仅对read有效).#read定义7个变量,分别对应/etc/passwd每行数据中的7列.while IFS=":" read user pass uid gid info home shelldo echo -e "My UID:$uid,\tMy home:$home"done < /etc/passwd原创 2021-03-05 21:11:50 · 1010 阅读 · 1 评论 -
shell脚本实现机选双色球
#!/bin/bash#功能描述(Descrtiption):机选双色球.#红色球1-33,蓝色球1-16,红色球号码不可以重复.#6组双色球,1组蓝色球.RED_COL='\033[91m'BLUE_COL='\033[34m'NONE_COL='\033[0m'red_ball=""#随机选择1-33的红色球(6个),1-16的篮球(1个).#每选出一个号码通过+=的方式存储到变量中.#通过grep判断新选出的红球是否已经出现过,-w选项是过滤单词.while :do转载 2021-03-03 22:26:18 · 1699 阅读 · 2 评论 -
Shell脚本使用trap捕获信号删除自己
test.sh内容#!/bin/bash#DESCRIBE:执行完该脚本后删除该脚本echo "生亦何欢,死亦何苦!"trap "rm -rf test.sh" EXIT #脚本退出执行trap后面双引号中的命令原创 2021-02-26 20:10:29 · 449 阅读 · 0 评论 -
shell脚本提交代码到gitlab仓库
vi /usr/local/bin/gitp#!/bin/bashset -ecd /opt/devopsgit pullTIME=$(date "+%Y%m%d%H%M")git add .git commit -m "${TIME}"git pushchmod +x /usr/local/bin/gitp提交代码时执行gitp即可原创 2021-02-05 20:18:05 · 962 阅读 · 2 评论 -
详解shell IFS分隔符
参考书籍:《Linux Shell核心编程指南》概念IFS(Internal Filed Separator,内部域分隔符)是一个set变量(shell变量),默认是空格、Tab键、换行符,使用for循环读取值列表时,会根据IFS的值判断列表中值的个数。IFS的多个值之间是“或”的关系查看IFS的值直接使用echo "$IFS"发现输出两个空行这是因为空格、Tab键、换行符都属于ASCII码表中的控制字符,是不可显示的内容,所有通过echo查看不到,需要通过od命令将数据转换为八进制后查看由原创 2021-01-31 21:08:17 · 9506 阅读 · 3 评论 -
shell中[ ]与[[ ]]的区别
区别一[ ]是符合POSIX标准的测试语句,兼容性更强,几乎可以运行在所有的Shell解释器中[[ ]]仅可运行在特定的几个Shell解释器中(如Bash等)区别二:<和>在[[ ]]中用作排序,而[ ]不支持进行比较前先设置LANG=C,在排序时使用ASCII码顺序数字的ASCII码应该小于大写字母,使用[[ ]]的结果是正确的区别三:[ ]中使用-a和-o表示逻辑与和逻辑或,[[ ]]使用&&和||来表示[[ ]]不支持-a区别四:在[ ]中==是字符匹配原创 2020-12-23 20:32:50 · 13849 阅读 · 4 评论 -
shell通过变量的值,获取这个值的值
通过a的值获取b的值a=bb=3c=`eval echo '$'"${a}"`echo $c原创 2020-12-06 16:00:21 · 2750 阅读 · 0 评论