首页
Search
1
安装docker时报错container-selinux >= 2:2.74
124 阅读
2
rsync命令(可替代rm删除巨量文件)
101 阅读
3
docker 镜像加速器配置,daemon.json文件详解
90 阅读
4
使用国内镜像地址拉取k8s安装需要的images
79 阅读
5
Redhat 8版本安装ansible步骤
75 阅读
运维
自动化运维
数据库
容器与k8s
环境
云计算
脚本
登录
Search
标签搜索
命令
nginx
Mingrui
累计撰写
64
篇文章
累计收到
0
条评论
首页
栏目
运维
自动化运维
数据库
容器与k8s
环境
云计算
脚本
页面
搜索到
8
篇与
的结果
2024-09-26
脚本百例—8:循环与判断中关于真假值的说明
有如下两例循环条件while (( COUNT < MAX )) do some stuff let COUNT++ done while [ -z "$LOCKFILE"] do some things done第一个while语句中的双括号界定了算术表达式,双括号内出现的变量名表示取值。(不需要写成$VAR的形式,直接在括号内使用VAR即可。)第二个while语句中的方括号和if语句中的用法一致,等同于使用test命令。{dotted startColor="#ff6c6c" endColor="#1989fa"/}在bash中,while语法规定该语句的条件是一系列要执行的命令(就像if语句),最后一个命令的退出状态决定了条件是真还是假。退出状态为0,表示真;否则,表示假。比如(( )),shell会对其中的表达式求值,如果结果不为0,那么(( ))就返回0;如果求值的结果为0,则返回1。比如下面这个无限循环:while ((1))do...done说明:((1))的计算结果为1,那么该表达式返回的值为0。在shell中0为真,因此这个while判断的结果永远为真,即无限循环。
2024年09月26日
74 阅读
0 评论
0 点赞
2024-09-25
脚本百例—7:(( ))与[[]]复合命令在if判断while循环等情况下的使用
$(()) 或者let进行整数运算说明:$(())表达式内不需要使用空格(加上也无所谓)。let命令是bash内建命令,其参数要经过单词扩展,因此最好给let的表达式加上引号。[root@web1 ~]# echo $((3+5)) 8 [root@web1 ~]# sum=200 [root@web1 ~]# echo $((3+5*sum)) 1003 [root@web1 ~]# let sum=3**5 [root@web1 ~]# echo $sum 243 {lamp/}复合命令if (( $# < 3 ))说明:双括号是复合命令的一种。这是一种比较新的bash改进,专门用于有if语句的场合。它会对其中的算术表达式求值。双括号与方括号的区别:可用于if语句的这两种语法之间的重要区别在于测试的表达方式及其能够测试的对象种类。双括号仅限于算术表达式。方括号还可以测试文件特性。但是方括号的算术测试语法远不如双括号方便,尤其是用括号将表达式分成若干子表达式时(在方括号中,需要给括号加上引号或将其转义。)例:[ ( 3 -gt 2 ) -o ( 4 -lt 1 ) ]模式匹配if [[ "${MYFILENAME}" == *.jpg ]]在if语句中使用符合命令[[]]可以在等量运算符的右侧启用shell风格的模式匹配。[[ ]] 语法不同于test命令的老形式[,它是一种较新的bash机制。能够在[]中使用的运算符也可以在[[]]中使用,但在后者中,等号是一种更为强大的字符串比较运算符。在这里面,=和==两者在语义上是相同的,但推荐使用==,这样更加醒目。标准模式匹配包括*(匹配任意数量的字符)、?(匹配单个字符)以及[](匹配字符列表中的任意一个)。注意,其写法与shell文件通配符类似,但不同于正则表达式。如果进行模式匹配,就不能把模式放入引号中,否则就只能匹配到以星号为首的字符串(模式匹配按照模式字符串的字面意义意义进行匹配)。扩展模式匹配通过启用某些bash选项,可以使用一些更为强大的模式匹配功能。shopt -s extglog #打开shell选项。extglob选项设计扩展模式匹配(或通配符匹配)。借助扩展模式匹配,我们可以使用多个模式,彼此间用|字符分割并通过括号分组。括号之前的@字符表示仅匹配括号中的模式一次。例,查找以.jpg或者.jpeg结尾的文件名shopt -s extglog if [[ "FN" == *.@(jpg|jpeg) ]] then ……扩展模式含义@( ... )仅匹配一次*( ... )匹配0次或多次+( ... )匹配1次或多次?( ... )匹配0次或1次!( ... )匹配除此之外的任何模式正则表达式匹配完整的脚本#!/usr/bin/env bash # cookbook filename: trackmatch # for CDTRACK in * do if [[ "$CDTRACK" =~ "([[:alpha:][:blank:]]*)- ([[:digit:]]*) - (.*)$" ]] then echo Track ${BASH_REMATCH[2]} is ${BASH_REMATCH[3]} mv "$CDTRACK" "Track${BASH_REMATCH[2]}" fi doneif [[ "$CDTRACK" =~ "([[:alpha:][:blank:]]*)- ([[:digit:]]*) - (.*)$" ]]说明:关于数组BASH_REMATCH,它是bash内建的数组变量。$BASH_REMATCH的各个元素由括号中的每个子表达式产生。第0个元素(${BASH_REMATCH[0]})是正则表达式所匹配的整个字符串。子表达式可以通过${BASH_REMATCH[1]},${BASH_REMATCH[2]}等形式引用。只要将正则表达式写成这样,就会生成变量$BASH_REMATCH。[:alpha:]*:这是第一个表达式,采用了POSIX字符组的[:alpha:]和[:blank:]代表任意的字母和空白字符,随后的星号表示0次或多次重复。[[:digit:]]*:这是第二个子表达式,[:digit:]代表数位,加上星号表示方括号中的数位出现0次或多次。(.*)$:匹配任意字符出现任意次数。$匹配结尾。
2024年09月25日
64 阅读
0 评论
0 点赞
2024-09-24
脚本百例—6:导出变量export
如果在某个脚本中定义了一个变量,又希望在其他的脚本中引用这个变量,可以使用export将希望传递给其他脚本的变量导出。使用方式:在export后面跟上变量赋值在export后面跟上要导出的变量名export FNAME export SIZE export MAX MAX=2018 SIZE=60 FANEM=/tmp/secatch ... export FNAME=/tmp/secatch export SIZE=64 export MAX=2018查看导出的变量set命令查看当前shell中的所有变量值及函数定义用env(或export -p)命令查看那些被导出的、可用于子shell的变量declare -p 也可以查看变量declare语句形式的输出可以在shell脚本中作为源代码,重新创建这些变量并为其赋值。各个选项(-i,-x,-r,-a)分别指明了变量为整数类型,已经导出、只读、数组类型。declare -p declare -i MYCOUNT="5" declare -x MYENV="10.5.1.2" declare -r MYFIXED="unchangeable" declare -a MYRA=([0]="5" [1]="10" [2]="15")
2024年09月24日
52 阅读
0 评论
0 点赞
2024-09-24
脚本百例—5:关于[ ]、{ }、( )以及$#&|等符号的解释
完整的变量引用语法,不仅要包括$,还要再变量名周围加上花括号。cat /tmp/rep${FN}port.txt 因为shell变量只包含字母数字和下划线,所以很多时候并不需要使用花括号来界定变量名。任何空白字符或标点符号(下划线除外)都足以提示变量名的结束位置。但只要有疑问,就应该用花括号。位置变量。在命令行上,出现在脚本名称之后的任意单词都可以在脚本中做为编号变量被访问。$1表示第一个位置变量,$2表示第二个位置变量。10以内的位置变量可以不用加花括号,除非要区分变量名与其后出现的文本。如果涉及两位数及以上的位置变量,如${10},则必须使用花括号,否则shell会把$10解释为${1}后面紧跟着数字0.特殊的shell变量$*:当前脚本或函数的位置参数。如果没有使用双引号,每个单词会被进一步分割和扩展。(每个位置参数会被扩展成独立的单词,这些单词会接着进行单词分割和路径名扩展。)如果使用了双引号引用,则返回单个字符串,其中各个参数之间以$IFS(一般为空格)的第一个字符分割(如"arg1 arg2 arg3")。$@:当前脚步或函数的位置参数,以双引号引用的字符串列表形式出现(如"arg1" "arg2" "arg3")。准确的说,出现在双引号("@")时,@会被扩展为以双引号引用的字符串列表形式。$#:当前脚本或函数的参数个数。$$:shell的进程ID。$0:shell或者shell脚本的名称$IFS:内部字段分隔符:作为单词分隔符的一系列字符。通常设置为空格、制表符、换行符${#}、${#VAR}、${VAR#alt}区别:${#}等同于$#,可以获取参数的数量;${#VAR}可以获得变量VAR所保存值的长度;${VAR#alt}执行的是替换操作(见下文)。默认值(:-=)FILEDIR=${1:-/tmp} :-的意思是如果指定的参数不存在或为空(这里的$1),则将运算符之后的内容(这里的/tmp)作为FILEDIR的值;否则使用已经设置好的值。注意,:-只返回值,但不赋值(本例中只是把/tmp这个值返回给FILEDDIR,但是不会给$1赋值为/tmp)。echo ${HOME:=/tmp} 该条命令会返回$HOME的当前值。如果$HOME为空或者没有设置,则会返回/tmp,并把/tmp赋值给$HOME。echo ${HOME=/tmp} 只有在变量不存在(从未设置或已经明确删除)时才进行赋值操作。cd ${BASE:="$(pwd)"} 用于替换的值不一定非得是字符串常量。它可以是更为复杂的shell表达式的结果,以及多种扩展。参数扩展:意味着可以使用其他变量,如${BASE:="$(pwd)"};波浪号扩展:意味着可以使用~bob这样的表达式,它会扩展成bob用户的主目录。可以通过${BASE:=~uid17}将默认值设置为用户UID7的主目录,但注意不要给~uid17加引号,因为波浪号扩展不会在引号中执行命令替换:将命令的输出结果作为变量的值,其语法为$(cmds)算数扩展:意味着可以使用$(())语法执行整数算术运算。例如echo ${BASE:=/home/uid$((ID+1))}${:?} 如果指定的参数不存在或为空,那么bash会输出错误消息并退出。FIELDIR=${1:?"Error. You must supply a scatch directory."}可以在错误信息中引用变量或执行其他命令。CVTTYPE=${3:?"Error. $USEAG $(rm $SCRATCHILE)"}会输出$USAGE的值,并执行rm操作。:-+=?总结echo username=${username[运算符]$NEWNAME}“:=” username变量为空或未设置时,进行赋值操作;“=” 只有当username完全不存在时,才进行赋值操作。若username为空,返回空值。“:-” username变量为空或未设置时,返回NEWNAME的值,但不为username赋值“-” 只有当username完全不存在时,才返回NEWNAME的值,但不为username赋值“:?” 当username为空或未定义时,返回NEWNAME的值并退出“?” 只有当username未定义时,返回NEWNAME的值并退出“:+” 当username已定义其不为空时,返回NEWNAME的值但不为username赋值“+ ” 当username已定义时,返回NEWNAME的值但不为username赋值[root@web1 keys]# username="" [root@web1 keys]# echo $username [root@web1 keys]# echo ${username:+111} [root@web1 keys]# echo ${username+111} 111 [root@web1 keys]# username=a [root@web1 keys]# echo ${username:+111} 111 [root@web1 keys]# echo ${username+111} 111 #制作一个由逗号分隔的值列表,但不希望开头或结尾处出现逗号。 LIST="${LIST}${LIST:+,}${NEWVAL}" #可以简写为LIST="$LIST${LIST:+,}$NEWVAL"说明:如果LIST为空或不存在,则表达式的${LIST}${LIST:+,}不会产生任何值。这就意味着第一次循环过后,LIST中保存的只有NEWVAL的值。如果LIST不为空,那么${LIST:+,}部分会返回一个逗号“,”,此时的LIST的值=旧值,新值。字符串操作运算符运算符操作${name:num1:num2}从字符串name的索引位置num1开始,返回长度为num2的子串${#name}返回字符串的长度${name#pattern}从字符串起始位置开始,删除匹配pattern的最短子串${name##pattern}从字符串起始位置开始,删除匹配pattern的最长子串${name%pattern}从字符串结束位置开始,删除匹配pattern的最短子串${name%%pattern}从字符串结束位置开始,删除匹配pattern的最长子串${name/pattern/string}将字符串中第一次出现的pattern替换为string${name//pattern/string}将字符串中出现的所有的pattern替换为string例:1️⃣获取某个数的绝对值:${MYVAR#-} #将查找到的第一个减号删掉2️⃣剥离变量中的路径信息,只保留文件名:方法一:basename命令 FILE=$(basename $FULLPATHTOFILE)方法二:FILE=${basename##*/}区别:方法一使用的括号会生成一个子shell来执行basename命令。方法二使用的花括号只是shell变量替换语法的一种,不会生成子shell,也不会执行命令;它从字符串起始位置开始匹配,使用最长匹配(##)模式,*匹配任意字符,/仅代表字面含义。[root@web1 keys]# pwd /root/1panel/1panel/apps/halo/halo/data/keys [root@web1 keys]# file=$(pwd) [root@web1 keys]# echo $file /root/1panel/1panel/apps/halo/halo/data/keys [root@web1 keys]# echo ${file##*/} keys特别的,当变量的值以/结尾时,使用bash替换需要先处理最后的这个/,否则返回的将是空值。file=/usr/local/bin/ echo ${file##*/} #返回值为空,因为*/匹配了全路径 #完整的处理方法 file=${file%/} #删除结尾处的/ file=${file##*/} #删除最后一个/及之前的所有字符 file=${file%.jpg} #如果存在,删除.jpg后缀 #以上三条命令等效于 basename $file .jpg [root@web1 keys]# file=$(pwd)/id_rsa.pub [root@web1 keys]# echo $file /root/1panel/1panel/apps/halo/halo/data/keys/id_rsa.pub [root@web1 keys]# echo $(basename $file ) id_rsa.pub [root@web1 keys]# echo $(basename $file .ppp) id_rsa.pub [root@web1 keys]# echo $(basename $file .pub) id_rsa [root@web1 keys]# echo $(basename $file rsa.pub) id_3️⃣删除变量中的文件名,保留目录部分:方法一:echo $(dirname $file)方法二:echo ${file%/*} #忽略了变量以/结尾的情况转换大小写变量FN中含有大小写字符串换为小写:${FN,,}换为大写:${FN^^}大小写互换:${FN~~}[root@web1 ~]# FN=aabbCCDD [root@web1 ~]# echo ${FN,,} aabbccdd [root@web1 ~]# echo ${FN^^} AABBCCDD [root@web1 ~]# echo ${FN~~} AABBccdd [root@web1 ~]# #只用一个操作符时,只转换第一个字符。 [root@web1 ~]# fn=Aabb [root@web1 ~]# echo ${fn^} Aabb [root@web1 ~]# echo ${fn~} aabb [root@web1 ~]# echo ${fn,} aabb declare 命令在变量声明时也可以实现以上大小写变换,参数如下declare -u [变量名] #全部大写declare -l [变量名] #全部小写declare -c [变量名] # 仅首字母大写例:利用数组和大小写转换来给字符串中的每个单词的首字母都变为大写while read TXT do RA=($TXT) echo ${RA[@]^}说明: ($TXT)命令初始化数组。文本中分割单词的空白字符划分了数组元素。[@]语法一次性引用了全部的数组元素,^操作符将每个元素的首字母转换为大写。
2024年09月24日
58 阅读
0 评论
0 点赞
2024-09-24
脚本百例—4:提高脚本可读性
尽可能的提高脚本的可读性,以便于理解和日后的维护。用注释记录脚本缩进并明智的使用垂直空白字符使用有意义的变量名使用函数并指定有意义的函数名在少于76个字符左右的有意义的位置断行将最有意义的部分放在最左侧使用内建命令:(空命令)和here-document 在脚本中嵌入文档。: <<'END_OF_DOCS' ... # 键入该脚本的说明文档 END_OF_DOCS #使用以下命令提取并使用POD文档 perldoc myscript #自动分页,以便在屏幕上阅读 pod2usage myscript #只提取usage小节 pod2html myscript > myscript.html #创建html网页
2024年09月24日
53 阅读
0 评论
0 点赞
1
2