Linux一键启动多个jar和Shell脚本的编写

背景

        公司项目是spring cloud eureka微服务系列的架构,在内网环境linux上需要一键启动/停止多个jar包。考虑到.sh文件的执行,仅供参考,有其他方案的同学请留言告知,在此先感谢了!

代码

        1.一键启动/停止多个jar

  • 启动:./java.sh start

  • 停止:./java.sh stop

  • 重启:./java.sh restart

java.sh代码: 

#!/bin/sh
export EUREKA=eureka-0.0.1-SNAPSHOT.jar
export GZGL=gzgl-server-0.0.1-SNAPSHOT.jar
export COLLECTER=ww-collecter-1.0.0-SNAPSHOT.jar
export WWZS=ROOT.war
export ZDMB=zdmb-server-0.0.1-SNAPSHOT.jar
export XTSZ=xtsz-server-0.0.1-SNAPSHOT.jar
export QBSJ=qbsj-server-0.0.1-SNAPSHOT.jar
export FILE=file-server-0.0.1-SNAPSHOT.jar
export PTAQ=ptaq-server-0.0.1-SNAPSHOT.jar
export QYXZ=qyxz-server-0.0.1-SNAPSHOT.jar
export FXPG=fxpg-server-0.0.1-SNAPSHOT.jar
export OPEN=open-server-0.0.1-SNAPSHOT.jar 
 
export EUREKA_port=8081
export GZGL_port=8082
export COLLECTER_port=8083
export WWZS_port=8084
export ZDMB_port=8085
export XTSZ_port=8086
export QBSJ_port=8087
export FILE_port=8088
export PTAQ_port=8089
export QYXZ_port=8090
export FXPG_port=8091
export OPEN_port=8092
 
case "$1" in
 
start)
        ## 启动eureka
        echo "--------eureka 开始启动--------------"
        nohup java -jar $EUREKA >/dev/null 2>&1 &
        EUREKA_pid=`lsof -i:$EUREKA_port|grep "LISTEN"|awk '{print $2}'`
        until [ -n "$EUREKA_pid" ]
            do
              EUREKA_pid=`lsof -i:$EUREKA_port|grep "LISTEN"|awk '{print $2}'`  
            done
        echo "EUREKA pid is $EUREKA_pid" 
        echo "--------eureka 启动成功--------------"
 
        ## 启动GZGL
        echo "--------开始启动GZGL---------------"
        nohup java -jar $GZGL >/dev/null 2>&1 &
        GZGL_pid=`lsof -i:$GZGL_port|grep "LISTEN"|awk '{print $2}'` 
        until [ -n "$GZGL_pid" ]
            do
              GZGL_pid=`lsof -i:$GZGL_port|grep "LISTEN"|awk '{print $2}'`  
            done
        echo "GZGL pid is $GZGL_pid"     
        echo "---------GZGL 启动成功-----------"
		
		## 启动COLLECTER
        echo "--------开始启动COLLECTER---------------"
        nohup java -jar $COLLECTER >/dev/null 2>&1 &
        COLLECTER_pid=`lsof -i:$COLLECTER_port|grep "LISTEN"|awk '{print $2}'` 
        until [ -n "$COLLECTER_pid" ]
            do
              COLLECTER_pid=`lsof -i:$COLLECTER_port|grep "LISTEN"|awk '{print $2}'`  
            done
        echo "COLLECTER pid is $COLLECTER_pid"     
        echo "---------COLLECTER 启动成功-----------"
		
		## 启动ZDMB
        echo "--------开始启动ZDMB---------------"
        nohup java -jar $ZDMB >/dev/null 2>&1 &
        ZDMB_pid=`lsof -i:$ZDMB_port|grep "LISTEN"|awk '{print $2}'` 
        until [ -n "$ZDMB_pid" ]
            do
              ZDMB_pid=`lsof -i:$ZDMB_port|grep "LISTEN"|awk '{print $2}'`  
            done
        echo "ZDMB pid is $ZDMB_pid"     
        echo "---------ZDMB 启动成功-----------"
		
		## 启动XTSZ
        echo "--------开始启动XTSZ---------------"
        nohup java -jar $XTSZ >/dev/null 2>&1 &
        XTSZ_pid=`lsof -i:$XTSZ_port|grep "LISTEN"|awk '{print $2}'` 
        until [ -n "$XTSZ_pid" ]
            do
              XTSZ_pid=`lsof -i:$XTSZ_port|grep "LISTEN"|awk '{print $2}'`  
            done
        echo "XTSZ pid is $XTSZ_pid"     
        echo "---------XTSZ 启动成功-----------"
		
		## 启动QBSJ
        echo "--------开始启动QBSJ---------------"
        nohup java -jar $QBSJ >/dev/null 2>&1 &
        QBSJ_pid=`lsof -i:$QBSJ_port|grep "LISTEN"|awk '{print $2}'` 
        until [ -n "$QBSJ_pid" ]
            do
              QBSJ_pid=`lsof -i:$QBSJ_port|grep "LISTEN"|awk '{print $2}'`  
            done
        echo "QBSJ pid is $QBSJ_pid"     
        echo "---------QBSJ 启动成功-----------"
		
		## 启动FILE
        echo "--------开始启动FILE---------------"
        nohup java -jar $FILE >/dev/null 2>&1 &
        FILE_pid=`lsof -i:$FILE_port|grep "LISTEN"|awk '{print $2}'` 
        until [ -n "$FILE_pid" ]
            do
              FILE_pid=`lsof -i:$FILE_port|grep "LISTEN"|awk '{print $2}'`  
            done
        echo "FILE pid is $FILE_pid"     
        echo "---------FILE 启动成功-----------"
		
		## 启动PTAQ
        echo "--------开始启动PTAQ---------------"
        nohup java -jar $PTAQ >/dev/null 2>&1 &
        PTAQ_pid=`lsof -i:$PTAQ_port|grep "LISTEN"|awk '{print $2}'` 
        until [ -n "$PTAQ_pid" ]
            do
              PTAQ_pid=`lsof -i:$PTAQ_port|grep "LISTEN"|awk '{print $2}'`  
            done
        echo "PTAQ pid is $PTAQ_pid"     
        echo "---------PTAQ 启动成功-----------"
		
		## 启动QYXZ
        echo "--------开始启动QYXZ---------------"
        nohup java -jar $QYXZ >/dev/null 2>&1 &
        QYXZ_pid=`lsof -i:$QYXZ_port|grep "LISTEN"|awk '{print $2}'` 
        until [ -n "$QYXZ_pid" ]
            do
              QYXZ_pid=`lsof -i:$QYXZ_port|grep "LISTEN"|awk '{print $2}'`  
            done
        echo "QYXZ pid is $QYXZ_pid"     
        echo "---------QYXZ 启动成功-----------"
		
		## 启动FXPG
        echo "--------开始启动FXPG---------------"
        nohup java -jar $FXPG >/dev/null 2>&1 &
        FXPG_pid=`lsof -i:$FXPG_port|grep "LISTEN"|awk '{print $2}'` 
        until [ -n "$FXPG_pid" ]
            do
              FXPG_pid=`lsof -i:$FXPG_port|grep "LISTEN"|awk '{print $2}'`  
            done
        echo "FXPG pid is $FXPG_pid"     
        echo "---------FXPG 启动成功-----------"
		
		## 启动OPEN
        echo "--------开始启动OPEN---------------"
        nohup java -jar $OPEN >/dev/null 2>&1 &
        OPEN_pid=`lsof -i:$OPEN_port|grep "LISTEN"|awk '{print $2}'` 
        until [ -n "$OPEN_pid" ]
            do
              OPEN_pid=`lsof -i:$OPEN_port|grep "LISTEN"|awk '{print $2}'`  
            done
        echo "OPEN pid is $OPEN_pid"     
        echo "---------OPEN 启动成功-----------"
         
        echo "===startAll success==="
        ;;
 
 stop)
        P_ID=`ps -ef | grep -w $EUREKA | grep -v "grep" | awk '{print $2}'`
        if [ "$P_ID" == "" ]; then
            echo "===EUREKA process not exists or stop success"
        else
            kill -9 $P_ID
            echo "EUREKA killed success"
        fi
		P_ID=`ps -ef | grep -w $GZGL | grep -v "grep" | awk '{print $2}'`
        if [ "$P_ID" == "" ]; then
            echo "===GZGL process not exists or stop success"
        else
            kill -9 $P_ID
            echo "GZGL killed success"
        fi
		P_ID=`ps -ef | grep -w $COLLECTER | grep -v "grep" | awk '{print $2}'`
        if [ "$P_ID" == "" ]; then
            echo "===COLLECTER process not exists or stop success"
        else
            kill -9 $P_ID
            echo "COLLECTER killed success"
        fi
		P_ID=`ps -ef | grep -w $WWZS | grep -v "grep" | awk '{print $2}'`
        if [ "$P_ID" == "" ]; then
            echo "===WWZS process not exists or stop success"
        else
            kill -9 $P_ID
            echo "WWZS killed success"
        fi
		P_ID=`ps -ef | grep -w $ZDMB | grep -v "grep" | awk '{print $2}'`
        if [ "$P_ID" == "" ]; then
            echo "===ZDMB process not exists or stop success"
        else
            kill -9 $P_ID
            echo "ZDMB killed success"
        fi
		P_ID=`ps -ef | grep -w $XTSZ | grep -v "grep" | awk '{print $2}'`
        if [ "$P_ID" == "" ]; then
            echo "===XTSZ process not exists or stop success"
        else
            kill -9 $P_ID
            echo "XTSZ killed success"
        fi
		P_ID=`ps -ef | grep -w $QBSJ | grep -v "grep" | awk '{print $2}'`
        if [ "$P_ID" == "" ]; then
            echo "===QBSJ process not exists or stop success"
        else
            kill -9 $P_ID
            echo "QBSJ killed success"
        fi
		P_ID=`ps -ef | grep -w $FILE | grep -v "grep" | awk '{print $2}'`
        if [ "$P_ID" == "" ]; then
            echo "===FILE process not exists or stop success"
        else
            kill -9 $P_ID
            echo "FILE killed success"
        fi
		P_ID=`ps -ef | grep -w $PTAQ | grep -v "grep" | awk '{print $2}'`
        if [ "$P_ID" == "" ]; then
            echo "===PTAQ process not exists or stop success"
        else
            kill -9 $P_ID
            echo "PTAQ killed success"
        fi
		P_ID=`ps -ef | grep -w $QYXZ | grep -v "grep" | awk '{print $2}'`
        if [ "$P_ID" == "" ]; then
            echo "===QYXZ process not exists or stop success"
        else
            kill -9 $P_ID
            echo "QYXZ killed success"
        fi
		P_ID=`ps -ef | grep -w $FXPG | grep -v "grep" | awk '{print $2}'`
        if [ "$P_ID" == "" ]; then
            echo "===FXPG process not exists or stop success"
        else
            kill -9 $P_ID
            echo "FXPG killed success"
        fi
		P_ID=`ps -ef | grep -w $OPEN | grep -v "grep" | awk '{print $2}'`
        if [ "$P_ID" == "" ]; then
            echo "===OPEN process not exists or stop success"
        else
            kill -9 $P_ID
            echo "OPEN killed success"
        fi
 
        echo "===stopAll success==="
        ;;   
 
restart)
        $0 stop
        sleep 2
        $0 start
        echo "===restartAll success==="
        ;;   
esac	
exit 0

 

        2.启动/停止单个jar

  • 启动:./java-one.sh start eureka 其他服务类似

  • 停止:./java-one.sh stop eureka 其他服务类似

  • 重启:./java-one.sh restart eureka  

java-one.sh代码: 

#!/bin/sh
export EUREKA=eureka-0.0.1-SNAPSHOT.jar
export GZGL=gzgl-server-0.0.1-SNAPSHOT.jar
export COLLECTER=ww-collecter-1.0.0-SNAPSHOT.jar
export WWZS=ROOT.war
export ZDMB=zdmb-server-0.0.1-SNAPSHOT.jar
export XTSZ=xtsz-server-0.0.1-SNAPSHOT.jar
export QBSJ=qbsj-server-0.0.1-SNAPSHOT.jar
export FILE=file-server-0.0.1-SNAPSHOT.jar
export PTAQ=ptaq-server-0.0.1-SNAPSHOT.jar
export QYXZ=qyxz-server-0.0.1-SNAPSHOT.jar
export FXPG=fxpg-server-0.0.1-SNAPSHOT.jar
export OPEN=open-server-0.0.1-SNAPSHOT.jar 
 
export EUREKA_port=8081
export GZGL_port=8082
export COLLECTER_port=8083
export WWZS_port=8084
export ZDMB_port=8085
export XTSZ_port=8086
export QBSJ_port=8087
export FILE_port=8088
export PTAQ_port=8089
export QYXZ_port=8090
export FXPG_port=8091
export OPEN_port=8092
 
case "$1" in
 
start)
	case "$2" in
		
		eureka|EUREKA)
			## 启动eureka
			echo "--------eureka 开始启动--------------"
			nohup java -jar $EUREKA >/dev/null 2>&1 &
			EUREKA_pid=`lsof -i:$EUREKA_port|grep "LISTEN"|awk '{print $2}'`
			until [ -n "$EUREKA_pid" ]
				do
				  EUREKA_pid=`lsof -i:$EUREKA_port|grep "LISTEN"|awk '{print $2}'`  
				done
			echo "EUREKA pid is $EUREKA_pid" 
			echo "--------eureka 启动成功--------------"
			;;
			
		gzgl|GZGL)
			## 启动GZGL
			echo "--------开始启动GZGL---------------"
			nohup java -jar $GZGL >/dev/null 2>&1 &
			GZGL_pid=`lsof -i:$GZGL_port|grep "LISTEN"|awk '{print $2}'` 
			until [ -n "$GZGL_pid" ]
				do
				  GZGL_pid=`lsof -i:$GZGL_port|grep "LISTEN"|awk '{print $2}'`  
				done
			echo "GZGL pid is $GZGL_pid"     
			echo "---------GZGL 启动成功-----------"
			;;
			
		collecter|COLLECTER)
			## 启动COLLECTER
			echo "--------开始启动COLLECTER---------------"
			nohup java -jar $COLLECTER >/dev/null 2>&1 &
			COLLECTER_pid=`lsof -i:$COLLECTER_port|grep "LISTEN"|awk '{print $2}'` 
			until [ -n "$COLLECTER_pid" ]
				do
				  COLLECTER_pid=`lsof -i:$COLLECTER_port|grep "LISTEN"|awk '{print $2}'`  
				done
			echo "COLLECTER pid is $COLLECTER_pid"     
			echo "---------COLLECTER 启动成功-----------"
			;;
			
		zdmb|ZDMB)
			## 启动ZDMB
			echo "--------开始启动ZDMB---------------"
			nohup java -jar $ZDMB >/dev/null 2>&1 &
			ZDMB_pid=`lsof -i:$ZDMB_port|grep "LISTEN"|awk '{print $2}'` 
			until [ -n "$ZDMB_pid" ]
				do
				  ZDMB_pid=`lsof -i:$ZDMB_port|grep "LISTEN"|awk '{print $2}'`  
				done
			echo "ZDMB pid is $ZDMB_pid"     
			echo "---------ZDMB 启动成功-----------"
			;;
			
		xtsz|XTSZ)
			## 启动XTSZ
			echo "--------开始启动XTSZ---------------"
			nohup java -jar $XTSZ >/dev/null 2>&1 &
			XTSZ_pid=`lsof -i:$XTSZ_port|grep "LISTEN"|awk '{print $2}'` 
			until [ -n "$XTSZ_pid" ]
				do
				  XTSZ_pid=`lsof -i:$XTSZ_port|grep "LISTEN"|awk '{print $2}'`  
				done
			echo "XTSZ pid is $XTSZ_pid"     
			echo "---------XTSZ 启动成功-----------"
			;;
			
		qbsj|QBSJ)
			## 启动QBSJ
			echo "--------开始启动QBSJ---------------"
			nohup java -jar $QBSJ >/dev/null 2>&1 &
			QBSJ_pid=`lsof -i:$QBSJ_port|grep "LISTEN"|awk '{print $2}'` 
			until [ -n "$QBSJ_pid" ]
				do
				  QBSJ_pid=`lsof -i:$QBSJ_port|grep "LISTEN"|awk '{print $2}'`  
				done
			echo "QBSJ pid is $QBSJ_pid"     
			echo "---------QBSJ 启动成功-----------"
			;;
			
		file|FILE)
			## 启动FILE
			echo "--------开始启动FILE---------------"
			nohup java -jar $FILE >/dev/null 2>&1 &
			FILE_pid=`lsof -i:$FILE_port|grep "LISTEN"|awk '{print $2}'` 
			until [ -n "$FILE_pid" ]
				do
				  FILE_pid=`lsof -i:$FILE_port|grep "LISTEN"|awk '{print $2}'`  
				done
			echo "FILE pid is $FILE_pid"     
			echo "---------FILE 启动成功-----------"
			;;
			
		ptaq|PTAQ)
			## 启动PTAQ
			echo "--------开始启动PTAQ---------------"
			nohup java -jar $PTAQ >/dev/null 2>&1 &
			PTAQ_pid=`lsof -i:$PTAQ_port|grep "LISTEN"|awk '{print $2}'` 
			until [ -n "$PTAQ_pid" ]
				do
				  PTAQ_pid=`lsof -i:$PTAQ_port|grep "LISTEN"|awk '{print $2}'`  
				done
			echo "PTAQ pid is $PTAQ_pid"     
			echo "---------PTAQ 启动成功-----------"
			;;
			
		qyxz|QYXZ)
			## 启动QYXZ
			echo "--------开始启动QYXZ---------------"
			nohup java -jar $QYXZ >/dev/null 2>&1 &
			QYXZ_pid=`lsof -i:$QYXZ_port|grep "LISTEN"|awk '{print $2}'` 
			until [ -n "$QYXZ_pid" ]
				do
				  QYXZ_pid=`lsof -i:$QYXZ_port|grep "LISTEN"|awk '{print $2}'`  
				done
			echo "QYXZ pid is $QYXZ_pid"     
			echo "---------QYXZ 启动成功-----------"
			;;
			
		fxpg|FXPG)
			## 启动FXPG
			echo "--------开始启动FXPG---------------"
			nohup java -jar $FXPG >/dev/null 2>&1 &
			FXPG_pid=`lsof -i:$FXPG_port|grep "LISTEN"|awk '{print $2}'` 
			until [ -n "$FXPG_pid" ]
				do
				  FXPG_pid=`lsof -i:$FXPG_port|grep "LISTEN"|awk '{print $2}'`  
				done
			echo "FXPG pid is $FXPG_pid"     
			echo "---------FXPG 启动成功-----------"
			;;
			
		open|OPEN)
			## 启动OPEN
			echo "--------开始启动OPEN---------------"
			nohup java -jar $OPEN >/dev/null 2>&1 &
			OPEN_pid=`lsof -i:$OPEN_port|grep "LISTEN"|awk '{print $2}'` 
			until [ -n "$OPEN_pid" ]
				do
				  OPEN_pid=`lsof -i:$OPEN_port|grep "LISTEN"|awk '{print $2}'`  
				done
			echo "OPEN pid is $OPEN_pid"     
			echo "---------OPEN 启动成功-----------"
			;;
    esac
	;;
 
 stop)
	case "$2" in
		
		eureka|EUREKA)
			P_ID=`ps -ef | grep -w $EUREKA | grep -v "grep" | awk '{print $2}'`
			if [ "$P_ID" == "" ]; then
				echo "===EUREKA process not exists or stop success"
			else
				kill -9 $P_ID
				echo "EUREKA killed success"
			fi
			;;
			
		gzgl|GZGL)	
			P_ID=`ps -ef | grep -w $GZGL | grep -v "grep" | awk '{print $2}'`
			if [ "$P_ID" == "" ]; then
				echo "===GZGL process not exists or stop success"
			else
				kill -9 $P_ID
				echo "GZGL killed success"
			fi
			;;
			
		collecter|COLLECTER)	
			P_ID=`ps -ef | grep -w $COLLECTER | grep -v "grep" | awk '{print $2}'`
			if [ "$P_ID" == "" ]; then
				echo "===COLLECTER process not exists or stop success"
			else
				kill -9 $P_ID
				echo "COLLECTER killed success"
			fi
			;;
			
		wwzs|WWZS)
			P_ID=`ps -ef | grep -w $WWZS | grep -v "grep" | awk '{print $2}'`
			if [ "$P_ID" == "" ]; then
				echo "===WWZS process not exists or stop success"
			else
				kill -9 $P_ID
				echo "WWZS killed success"
			fi
			;;
			
		zdmb|ZDMB)
			P_ID=`ps -ef | grep -w $ZDMB | grep -v "grep" | awk '{print $2}'`
			if [ "$P_ID" == "" ]; then
				echo "===ZDMB process not exists or stop success"
			else
				kill -9 $P_ID
				echo "ZDMB killed success"
			fi
			;;
			
		xtsz|XTSZ)
			P_ID=`ps -ef | grep -w $XTSZ | grep -v "grep" | awk '{print $2}'`
			if [ "$P_ID" == "" ]; then
				echo "===XTSZ process not exists or stop success"
			else
				kill -9 $P_ID
				echo "XTSZ killed success"
			fi
			;;
			
		qbsj|QBSJ)
			P_ID=`ps -ef | grep -w $QBSJ | grep -v "grep" | awk '{print $2}'`
			if [ "$P_ID" == "" ]; then
				echo "===QBSJ process not exists or stop success"
			else
				kill -9 $P_ID
				echo "QBSJ killed success"
			fi
			;;
			
		file|FILE)
			P_ID=`ps -ef | grep -w $FILE | grep -v "grep" | awk '{print $2}'`
			if [ "$P_ID" == "" ]; then
				echo "===FILE process not exists or stop success"
			else
				kill -9 $P_ID
				echo "FILE killed success"
			fi
			;;
			
		ptaq|PTAQ)
			P_ID=`ps -ef | grep -w $PTAQ | grep -v "grep" | awk '{print $2}'`
			if [ "$P_ID" == "" ]; then
				echo "===PTAQ process not exists or stop success"
			else
				kill -9 $P_ID
				echo "PTAQ killed success"
			fi
			;;
		
		qyxz|QYXZ)
			P_ID=`ps -ef | grep -w $QYXZ | grep -v "grep" | awk '{print $2}'`
			if [ "$P_ID" == "" ]; then
				echo "===QYXZ process not exists or stop success"
			else
				kill -9 $P_ID
				echo "QYXZ killed success"
			fi
			;;
			
		fxpg|FXPG)
			P_ID=`ps -ef | grep -w $FXPG | grep -v "grep" | awk '{print $2}'`
			if [ "$P_ID" == "" ]; then
				echo "===FXPG process not exists or stop success"
			else
				kill -9 $P_ID
				echo "FXPG killed success"
			fi
			;;
			
		open|OPEN)
			P_ID=`ps -ef | grep -w $OPEN | grep -v "grep" | awk '{print $2}'`
			if [ "$P_ID" == "" ]; then
				echo "===OPEN process not exists or stop success"
			else
				kill -9 $P_ID
				echo "OPEN killed success"
			fi
			;;
	esac
	;;
 
restart)
        $0 stop $2
        sleep 2
        $0 start $2
        echo "===restart $2 success==="
        ;;   
esac	
exit 0

问题

        1) /bin/bash^M: 坏的解释器: 没有那个文件或目录

执行shell脚本是报错:/bin/bash^M: 坏的解释器: 没有那个文件或目录

是因为该文件在windows系统上打开过,关闭后其中的空格符号和Linux的不同,导致这个报错,我们可以通过sed命令与正则的配合将文件中的空格符号替换成linux的空格

sed -i 's/\r$//' java.sh

 

      2) -bash: ./java.sh: 权限不够

[root@node37 java]# ./java.sh start

-bash: ./java.sh: 权限不够

chmod +7 java.sh

命令

        1)远程从本节点传输文件夹到另一节点,在要传输的文件夹上一级执行下列命令

scp -r java/ root@10.10.10.10:/opt/

 

        2)远程从本节点传输文件到另一节点,在要传输的文件同级目录下执行下列命令

scp eureka-0.0.1.SNAPSHOT.jar root@10.10.10.10:/opt/java

 

        3)查看端口被占用的进程

netstat -anp | grep  8081

 

        4)查看Java程序启动的命令

ps -ef|grep java

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值