shell常用语法及实例

#第一章 shell变量

1.本地变量

变量被单引号和双引号引起来的区别:单引号直接输出,单引号里面是啥会原字符串输出,双引号先解析里面的内容然后再输出。

2.全局变量(当前系统下所有环境都生效的变量)

使用env可以查看当前系统下所有的全局变量
env |grep 变量   查看全局变量的值
定义方式:
方法一:  变量=值
  export   变量
方法二:export   变量=值(最常用)

3.内置变量(bash内部直接定义好的特殊参数,我们可以直接拿过来用)。

man  bash   查看内置变量
$0  获取当前脚本文件名
$n  获取当前执行脚本的第n个参数值,n大于10,用${10}
$?  获取当前脚本上一条命令的返回值,执行成功返回0,执行失败非0
$#  获取当前脚本参数总个数
## 精确截取
格式:${变量名:起始位置:截取长度}   注意:第一个位置从0开始
echo  ${file:0-8,3}  从倒数第八个开始截取3个字符。

默认值

v a r : − s t r i n g , {var:-string}, var:string,{var:+string}, v a r : = s t r i n g , {var:=string}, var:=string,{var:?string}

1.  ${var:-string}和${var:=string}:若变量var为空,则用在命令行中用string来替换${var:-string},否则变量var不为空时,则用变量var的值来替换${var:-string};对于${var:=string}的替换规则和${var:-string}是一样的,所不同之处是${var:=string}若var为空时,用string替换${var:=string}的同时,把string赋给变量var: ${var:=string}很常用的一种用法是,判断某个变量是否赋值,没有的话则给它赋上一个默认值。

2. ${var:+string}的替换规则和上面的相反,即只有当var不是空的时候才替换成string,若var为空时则不替换或者说是替换成变量 var的值,即空值。(因为变量var此时为空,所以这两种说法是等价的)

3. ${var:?string}替换规则为:若变量var不为空,则用变量var的值来替换${var:?string};若变量var为空,则把string输出到标准错误中,并从脚本中退出。我们可利用此特性来检查是否设置了变量的值。

命令变量

( ) 和 反 引 号 推 荐 使 用 ()和反引号 推荐使用 ()使()使用命令变量。

删除变量

unset 变量名

第二章 shell核心知识

2.1.1测试语句

应用场景

判断条件是否成立

语句格式

A test 条件表达式

[root@zh ~]# test 1 = 1
[root@zh ~]# echo $?
0

B 【 条件表达式 】(推荐)

[root@zh ~]# [ 1 = 1 ]
[root@zh ~]# echo $?
0
[root@zh ~]# [ 1 = 2 ]
[root@zh ~]# echo $?
1

注意:[]和条件表达式之间有空格隔开,=两边有空格

2.1.2 条件表达式

逻辑表达式

逻辑表达式常用于多个条件之间
常用的逻辑符号 && 和 ||

[root@zh ~]# [ 1 = 1 ] && echo "条件成立"
条件成立
[root@zh ~]# [ 1 = 2 ] && echo "条件成立"
[root@zh ~]# [ 1 = 2 ] ||  echo "条件不成立"
条件不成立

文件表达式

-f 是否是个文件

[root@zh ~]# [ -f a.sh ] && cat a.sh

-d 是否是个目录

#判断是否有backup这个目录,如果没有这个目录就创建该目录
[root@zh ~]# [ -d backup ] ||  mkdir backup
[root@zh ~]# ls
apache-maven-3.3.9  appconf.conf  a.sh  backuo  backup  b.sh  dumplog.sh  jdk1.8.0_11  read.sh  test.txt

-x 是否有执行权限

[root@zh ~]# [ -x a.sh ] && ./a.sh
else

数值表达式

-gt -lt -eq -ne -le -ge
注意:生产中ne和eq使用的频率较高

[root@zh ~]# [ 1 -eq 2 ]
[root@zh ~]# echo $?
1
[root@zh ~]# [ 2 -eq 2 ]
[root@zh ~]# echo $?
0
[root@zh ~]# [ 1 -ne 2 ]
[root@zh ~]# echo $?
0
[root@zh ~]# [ 1 -le 2 ]
[root@zh ~]# echo $?
0

字符串表达式

字符串内容是否一致

一致 ==
不一致 !=

[root@zh ~]# [ aaa == aaa ]
[root@zh ~]# echo $?
0
[root@zh ~]# [ aaa == bbb ]
[root@zh ~]# echo $?
1

计算表达式

计算格式
格式一:$(())
注意:括号里面的空格没事

[root@zh ~]# echo $((1+3))
4

格式二:let 变量名a=变量名a+1

[root@zh ~]# a=1
[root@zh ~]# let j=a+4
[root@zh ~]# echo $j
5
[root@zh ~]# let j= a + 4
-bash: let: j=: syntax error: operand expected (error token is "=")

注意:对于let表达式必须是个整体,不能有空格

数组操作

数组简介

bash支持一维数组,不支持多维数据,并且没有限定数组的大小。数组元素的下标从零开始计算。获取数组元素要利用下标,下标可以是整数或者表达式,其值应该大于或者等于0

定义格式

array_name=(val1…valn)
值之间使用空格进行隔开

#单行定义
[root@zh ~]# arr1=(a b c)
#多行定义
[root@zh ~]# arr2=(
> q
> e
> )
#单元素定义
[root@zh ~]# arr3[1]=nihao
[root@zh ~]# arr3[2]=d
[root@zh ~]# echo ${#arr3[@]}
2
[root@zh ~]# echo ${!arr3[@]}
1 2

信息查看

数组获取方式

查看内容
[root@zh ~]# echo ${arr1[0]}
a
[root@zh ~]# echo ${arr1[1]}
b
[root@zh ~]# echo ${arr1[*]}
a b c
[root@zh ~]# echo ${arr1[@]}
a b c
获取下标
[root@zh ~]# echo ${!arr1[@]}
0 1 2
获取数组长度
[root@zh ~]# echo ${#arr1[@]}
3
[root@zh ~]# echo ${#arr2[@]}
2

增删改

 增
[root@zh ~]# arr3[1]=nihao
[root@zh ~]# arr3[2]=d
获取元素
[root@zh ~]#  arr3[12]=sdsddgfgfhghgjhkkj
[root@zh ~]# echo ${arr3[11]}

[root@zh ~]# echo ${arr3[12]}
sdsddgfgfhghgjhkkj
[root@zh ~]# echo ${arr3[12]:2:4}
sddg

 改
元素整体替换
[root@zh ~]#  arr3[12]=gaile
[root@zh ~]# echo ${arr3[12]}
gaile
元素部分替换
[root@zh ~]# echo ${arr3[12]/ai/haha}
ghahale     #并没有真正修改
[root@zh ~]# echo ${arr3[12]}
gaile

删除
部分删除
[root@zh ~]# unset arr3[12]
[root@zh ~]# echo ${arr3[12]}

整体删除
[root@zh ~]# echo ${arr1[@]}
a b c
[root@zh ~]# unset arr1
[root@zh ~]# echo ${arr1[@]}

重定向

将左侧内容以覆盖的方式输出到右侧文件中。

将左侧内容以追加的方式输出到右侧文件中。

管道符 |

信息传递使用的

使用格式

命令1 | 命令2 将管道符左侧的内容传递到管道符右侧的命令去使用

其他符号

& 将一个命令从前台转移到后台去执行。

使用格式:

命令 &
后台展示 &

信息符号

2 错误信息
1 正确信息
2>&1 所有信息

特殊设备

/dev/null 黑洞,将一些无用信息输出到其中丢弃
/dev/zero 写入它的输出会丢失不见 ,/dev/zero主要的用处是用来创建一个指定长度用于初始化的空文件,像临时交换文件

简单流程控制

if语句

if [ 条件 ]
then
指令
fi

if [ 条件 ]
then
指令1
else
指令2
fi

#!/bin/bash
if [ $1 == "nan" ]
then
  echo  "性别男"
else
  echo  "性别女"
fi

if [ 条件 ]
then
指令1
elif [ 条件 ]
then
指令2
else
指令3
fi

#!/bin/bash
if [ "$1" == "start"  ]
then
  echo "服务启动中"
elif [ "$1" == "stop" ]
then
  echo "服务关闭中"
elif [ "$1" == "restart"  ]
then
  echo "服务重启中"
else
  echo  "脚本$0的使用方式:/bin/bash $0 [ start | stop |restart ]"
fi

case语句

case 变量 in
值1)
echo 1
;;
值2)
echo 2
;;
值3)
echo 10
;;
*)
echo else
;;
esac

注意:分号不能少

#/bin/bash
case $1 in
   "start")
       echo  "服务启动中"
       ;;
   "stop")
       echo  "服务停止中"
       ;;
   "restart")
       echo  "服务重启中"
       ;;
   *)
      echo  "脚本$0的使用方式:/bin/bash $0 [ start | stop |restart ]"
      ;;
esac

循环语句

1)for语句
for i  in $(ls /root)
do 
  echo $i
done
2)while语句
#!/bin/bash
a=2
while [ $a -lt 5 ] 
do
  echo $a
  a=$(($a+1))
done
3)until语句

只要条件不成立,就一直运行下去

#!/bin/bash
a=1
until [ $a -eq 5 ]
do
  echo $a
  a=$(($a+1))
done

循环退出

break 跳出所有循环
#!/bin/bash
# 脚本进入死循环,直到用户输入的数字大于5
while :
do
 echo -n "请输入您的数字,最好在1-5之间"
 read anum
 case $anum in 
   1|2|3|4|5)
     echo  "您输入的数字为:$anum"
     ;;
   *)
     echo "您输入的数字不在范围内,退出"
     break
     ;;
 esac
done

while : 表示死循环

break n 跳出第n个循环 跳出嵌套循环
#!/bin/bash
#break n 演示
for var1 in {1..5}
do
  for var2 in {0..4}
  do
    if [ $var1 -eq 2 -a $var2 -eq 0  ]
    then
       break 2
    else 
       echo " $var1 $var2 "
    fi
  done
done

-a 就是&&意思,两个条件同时满足才往下执行
演示结果:

[root@zh ~]# /bin/bash breakn.sh 
 1 0 
 1 1 
 1 2 
 1 3 
 1 4
continue 跳出当前循环
#!/bin/bash
while :
do
 echo -n "请输入您的数字,最好在1-5之间"
 read anum
 case $anum in 
   1|2|3|4|5)
     echo  "您输入的数字为:$anum"
     ;;
   *)
     continue
     echo "您输入的数字不在范围内,退出"
     ;;
 esac
done

演示结果:

[root@zh ~]# /bin/bash continue.sh 
请输入您的数字,最好在1-5之间1
您输入的数字为:1
请输入您的数字,最好在1-5之间2
您输入的数字为:2
请输入您的数字,最好在1-5之间3
您输入的数字为:3
请输入您的数字,最好在1-5之间4
您输入的数字为:4
请输入您的数字,最好在1-5之间5
您输入的数字为:5
请输入您的数字,最好在1-5之间6
请输入您的数字,最好在1-5之间^C
[root@zh ~]#
exit 退出程序
#!/bin/bash
#break n 演示
for var1 in {1..5}
do
  for var2 in {0..4}
  do
    if [ $var1 -eq 2 -a $var2 -eq 0  ]
    then
       exit
    else 
       echo " $var1 $var2 "
    fi
  done
done

复杂流程控制语句

函数

函数样式
简单函数

函数名(){函数体}

[root@zh ~]# cat simple-fun.sh 
#!/bin/bash
#简单函数定义和调用
diaoyong(){

 echo "我是周浩"
}

diaoyong
[root@zh ~]# /bin/bash simple-fun.sh 
我是周浩
传参函数

函数名(){
函数体 $n
}

[root@zh ~]# cat chuancan.sh 
#!/bin/bash
#传参函数的定义和调用
chuancan(){
   arg=$1
   echo "你好,我是"$arg
}

chuancan aaa
chuancan bbb
[root@zh ~]# /bin/bash chuancan.sh
你好,我是aaa
你好,我是bbb
脚本传参 函数调用
[root@zh ~]# cat jbcc.sh 
#!/bin/bash
#脚本函数的定义和调用
chuancan(){
   xingming=$1
   echo "你好,我是"$xingming
}

chuancan $1
[root@zh ~]# /bin/bash jbcc.sh zh
你好,我是zh
脚本传参 生产中用
#!/bin/bash
#脚本函数的定义和调用  生产中用的方式 使用局部变量的方式传参
arg=$1
chuancan(){
   xingming=$1
   echo "你好,我是"$xingming
}

chuancan $arg

shell常用的命令

grep

grep [参数] [关键字] 【文件名】
-c 只输出匹配行的计数
-n 显示匹配行及行号
-v 取反,显示不匹配行的内容
-i 忽略大小写
-r 递归获取内容

[root@zh ~]# grep -rn nihao /root/*
/root/file.txt:1:nihao
/root/file.txt:2:nihao
/root/test:1:aaa nihao

egrep 将带有nihao或者AAA的行显示出来,支持正则

[root@zh ~]# egrep 'nihao|AAA' test
aaa nihao
AAA   DFDF

sed

格式详解

sed [参数] ‘<匹配条件> [动作]’ 【文件名】

参数详解:

-i 表示对文件进行编辑
-n 取消静默输出

匹配条件

关键字匹配格式:
‘/关键字/’
注意:隔离符号/可以替换成@、#、!等符号
根据情况使用,如果关键字和隔离符号有冲突,就更换成其他的符号即可。

动作详解

a 在匹配到内容的下一行追加内容
i 在匹配到内容的当前行追加内容
d 删除匹配到的内容
s 替换匹配到的内容
p 查看指定内容

[root@zh ~]# sed -n '/SED4/p' sed.txt 
nihao  SED4  SED5 SED6
[root@zh ~]# cat sed.txt 
nihao  sed1  sed2 sed3
nihao  sed4  sed5 sed6
nihao  sed7  sed8 sed9
[root@zh ~]# sed '3p' sed.txt 
nihao  sed1  sed2 sed3
nihao  sed4  sed5 sed6
nihao  sed7  sed8 sed9
nihao  sed7  sed8 sed9
sed默认会将原文全部显示出来然后再将想要的显示出来。
[root@zh ~]# sed -n '3p' sed.txt 
nihao  sed7  sed8 sed9
使用-n参数取消静默输出,这样原文就不会显示了。

替换内容
样式一、
sed -i ‘行号s#原内容#替换内容#列号’ 文件名

注意:行号不写表示所有行,列好不写表示第一个匹配到的列。

[root@zh ~]# sed 's#sed#SED#' sed.txt 
nihao  SED1  sed2 sed3
nihao  SED4  sed5 sed6
nihao  SED7  sed8 sed9
不加-i表示对文件进行模拟操作
[root@zh ~]# cat sed.txt 
nihao  sed1  sed2 sed3
nihao  sed4  sed5 sed6
nihao  sed7  sed8 sed9
[root@zh ~]# sed -i 's#sed#SED#' sed.txt 
[root@zh ~]# cat sed.txt 
nihao  SED1  sed2 sed3
nihao  SED4  sed5 sed6
nihao  SED7  sed8 sed9

样式二、
sed -i ‘s#原内容#替换内容#g’ 文件名
g 表示所有匹配到的 样式二表示全文替换

[root@zh ~]# sed -i 's#sed#SED#g' sed.txt 
[root@zh ~]# cat sed.txt 
nihao  SED1  SED2 SED3
nihao  SED4  SED5 SED6
nihao  SED7  SED8 SED9

增加实践
格式
sed -i ‘行号a\增加的内容’ 文件名
注意:如果增加多行,可以在行号处写个范围值,彼此之间用逗号隔开,例如:
sed -i ‘1,3a\增加内容’ 文件名

[root@zh ~]# cat -n sed.txt 
     1	nihao  SED1  SED2 SED3
     2	nihao  SED4  SED5 SED6
     3	nihao  SED7  SED8 SED9
[root@zh ~]# sed -i '2a\add-1' sed.txt
[root@zh ~]# cat -n sed.txt 
     1	nihao  SED1  SED2 SED3
     2	nihao  SED4  SED5 SED6
     3	add-1
     4	nihao  SED7  SED8 SED9
[root@zh ~]# sed -i '1,3a\add-3' sed.txt
[root@zh ~]# cat -n sed.txt 
     1	nihao  SED1  SED2 SED3
     2	add-3
     3	nihao  SED4  SED5 SED6
     4	add-3
     5	add-1
     6	add-3
     7	nihao  SED7  SED8 SED9
[root@zh ~]# sed -i '/SED1/a\add-3' sed.txt 在匹配到内容后面增加
[root@zh ~]# cat -n sed.txt 
     1	nihao  SED1  SED2 SED3
     2	add-3
     3	add-3
     4	nihao  SED4  SED5 SED6
     5	add-3
     6	add-1
     7	add-3
     8	nihao  SED7  SED8 SED9

在当前行增加使用-i参数 -a在匹配到的下一行增加,-i用法同-a

[root@zh ~]# sed -i '1i\insert1' sed.txt 
[root@zh ~]# cat -n sed.txt 
     1	insert1
     2	nihao  SED1  SED2 SED3
     3	add-3
     4	add-3
     5	nihao  SED4  SED5 SED6
     6	add-3
     7	add-1
     8	add-3
     9	nihao  SED7  SED8 SED9

删除演示

sed -i ‘行号d’ 文件名
如果要删除多行,可以使用行号之间用逗号隔开,如 sed -i ‘1,3d’ 文件名

[root@zh ~]# cat -n sed.txt 
     1	insert1
     2	nihao  SED1  SED2 SED3
     3	add-3
     4	add-3
     5	nihao  SED4  SED5 SED6
     6	add-3
     7	add-1
     8	add-3
     9	nihao  SED7  SED8 SED9
[root@zh ~]# sed -i '8d' sed.txt 
[root@zh ~]# cat -n sed.txt 
     1	insert1
     2	nihao  SED1  SED2 SED3
     3	add-3
     4	add-3
     5	nihao  SED4  SED5 SED6
     6	add-3
     7	add-1
     8	nihao  SED7  SED8 SED9
[root@zh ~]# sed -i '4,7d' sed.txt 
[root@zh ~]# cat -n sed.txt 
     1	insert1
     2	nihao  SED1  SED2 SED3
     3	add-3
     4	nihao  SED7  SED8 SED9
[root@zh ~]# sed -i '/add-3/d' sed.txt 
[root@zh ~]# cat -n sed.txt 
     1	insert1
     2	nihao  SED1  SED2 SED3
     3	nihao  SED7  SED8 SED9
[root@zh ~]# sed -i '/SED/d' sed.txt 
[root@zh ~]# cat -n sed.txt 
     1	insert1

awk

awk是一个功能强大的文档编辑工具,不仅可以以行为单位处理文件还可以以列为单位处理文件。以及某些流程语句。

格式详解

awk [参数] ‘[动作]’ 文件名

#### 常见参数:

-F 指定列的分隔符

[root@zh ~]# cat passwd.txt 
dockerroot:x:997:994:Docker User:/var/lib/docker:/sbin/nologin
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
[root@zh ~]# awk -F ':' '{print $1,$2}' passwd.txt 
dockerroot x
apache x

-f 调用脚本

[root@zh ~]# cat filename 
/nolog/{ print "第" NR "行的内容是:"$0}
[root@zh ~]# awk -f  filename passwd.txt 
第1行的内容是:dockerroot:x:997:994:Docker User:/var/lib/docker:/sbin/nologin
第2行的内容是:apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin

-v 定义变量
命令行方式
传入单值

[root@zh ~]# echo | awk -v var1=100 '{print var1}' 
100

传入多值

[root@zh ~]# echo | awk '{print v1,v2}' v1=100 v2=200
100 200

注意:-v的使用,需要结合|符号才可以。

常见动作:

print 显示内容
$0 显示当前行所有内容
$n 显示当前行的第n列的内容,如果存在多个列,中间使用逗号隔开。

动作组成

BEGIN { 命令} 初始代码块,主要和变量相关

[root@zh ~]# awk -F ':'   'BEGIN{OFS="|"} {print $1,$7}' passwd.txt 
dockerroot|/sbin/nologin
apache|/sbin/nologin

/partern/{命令} 匹配、执行代码块

[root@zh ~]# awk '/awk/' awk.txt 
nihao awk1 awk2 awk3
nihao awk4 awk5 awk6

END {命令} 结束代码块,主要和信息输出有关

[root@zh ~]# awk -F':'   'BEGIN{print "行号 用户 登录bash"} {print NR,$1,$7} END{ print "----------结束了-------------"}' passwd.txt 
行号 用户 登录bash
1 dockerroot /sbin/nologin
2 apache /sbin/nologin
----------结束了-------------
内置变量
NR   行号
NF   输出最后一列的内容
OFS  输出格式的列分隔符,默认空格
FS   输入文件的列分隔符,缺省是连续的空格和Tab
[root@zh ~]# cat awk.txt 
nihao awk1 awk2 awk3
nihao awk4 awk5 awk6

print后面不指定列号,会默认将文件内容全部打印出来。
[root@zh ~]# awk '{ print }' awk.txt 
nihao awk1 awk2 awk3
nihao awk4 awk5 awk6
[root@zh ~]# awk '{ print $1,$3 }' awk.txt 
nihao awk2
nihao awk5
#显示出行号
[root@zh ~]# awk '{ print NR,$1,$3 }' awk.txt 
1 nihao awk2
2 nihao awk5
#显示第几行的内容
[root@zh ~]# awk ' NR==1 { print $1,$3 }' awk.txt 
nihao awk2
[root@zh ~]# awk '/awk/' awk.txt 
nihao awk1 awk2 awk3
nihao awk4 awk5 awk6
awk进阶

匹配当前目录下文件大于200b的文件 if语句

[root@zh ~]# ll |awk   '{ if(($5>200 && /^-/)) print "\n" "文件名称:"  $9 "\t" "文件大小:" $5 "B"}'

文件名称:break.sh	文件大小:258B

文件名称:case.sh	文件大小:285B

文件名称:continue.sh	文件大小:261B

文件名称:dumplog.sh	文件大小:202B

文件名称:duoif.sh	文件大小:261B

循环遍历字符串abcde for语句

[root@zh ~]# echo "abcde" | awk -F '' '{ for(i=1;i<=NF;i++)  print $i }'
a
b
c
d
e

find命令

用法格式

find 路径 参数 关键字

参数详解
-name  按照文件名查找文件
-user  按照文件属主来查看文件
-group 按照文件所属组来查看文件
-type  查找某一类型的文件
诸如:
b - 块设备文件
d - 目录
c - 字符设备文件
p - 管道文件
l - 符号链接文件
f - 普通文件
-size n(K|M|G]) : [c] 查找文件长度为n块的文件,带有c时表示文件长度以字节计。
-perm 按照文件权限进行查找。
-mtime  查找n天以内或以外修改的文件
-ctime  查找n天以内或以外改变的文件
-atime  查找n天以内或以外访问的文件
-depth  在查找文件时,首先查找当前目录的文件,然后再在其子目录下进行查找。
-mindepth n 在查找文件时,首先查找第n层目录的文件,然后再在其子目录下进行查找
-path "子目录" 在指定的子目录下查找,一般与-prune使用。
-newer 查找比指定文件新的文件。
!: 表示取反
动作详解
-print  默认选项,显示名称。-o -print 表示不仅仅显示目录名,还显示目录里面的文件名。
-ls  显示文件属性
-exec 命令 {} \; 使用命令对查找结果处理,查找结果使用"{}”来表示。

实例:将查找的文件重命名

find /root/ -name "ok" -exec mv {} {}.bak \;
[root@zh ~]# find / -name "ok"
/root/ok
[root@zh backup]# find /root/backup/ -type f 
/root/backup/a.sh
/root/backup/exit.sh
/root/backup/case.sh
[root@zh backup]# find /root/backup/ -type d 
/root/backup/
[root@zh backup]# find /root/backup/ -type f -name "jb*"
/root/backup/jbcc.sh

stat命令可以显示出文件的详细信息
[root@zh backup]# stat b.sh
  File: ‘b.sh’
  Size: 62        	Blocks: 8          IO Block: 4096   regular file
Device: fd01h/64769d	Inode: 917520      Links: 1
Access: (0755/-rwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2021-10-06 11:58:23.499491332 +0800
Modify: 2021-09-22 17:36:55.192443316 +0800
Change: 2021-10-06 22:29:49.868751621 +0800
 Birth: -

查找5天内有修改的文件

[root@zh backup]# find /root -mtime -5
/root
/root/.viminfo
/root/file.txt
/root/filename
/root/.bash_history
/root/passwd.txt
/root/ok
/root/sed.txt
/root/backup
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值