shell 教程3 流程控制 循环 函数 输入输出重定向 文件包含

Shell 流程控制

和 Java、PHP 等语言不一样,sh 的流程控制不可为空,如(以下为 PHP 流程控制写法):

实例

<?php if (isset($_GET["q"])) { search(q); } else { *// 不做任何事情* } 在 sh/bash 里可不能这么写,如果 else 分支没有语句执行,就不要写这个 else。 ------ ## if else ### fi if 语句语法格式: ``` if condition then command1 command2 ... commandN fi ``` 写成一行(适用于终端命令提示符): ``` if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi ps -ef | grep -c "ssh" 我的虚拟机为3 if [ $(上面的) -gt 1 ]; then echo "true"; fi ``` 末尾的 fi 就是 if 倒过来拼写,后面还会遇到类似的。 ### if else if else 语法格式: ``` if condition then command1 command2 ... commandN else command fi ``` ### if else-if else if else-if else 语法格式: ``` if condition1 then command1 elif condition2 then command2 else commandN fi ``` 以下实例判断两个变量是否相等: ## 实例 ```shell a=10 b=20 if [ $a == $b ] then echo "a 等于 b" elif [ $a -gt $b ] then echo "a 大于 b" elif [ $a -lt $b ] # test $[a] -lt $[b] then echo "a 小于 b" else echo "没有符合的条件" fi ``` 输出结果: ``` a 小于 b ``` if else 语句经常与 test 命令结合使用,如下所示: ## 实例 ```shell num1=$[2*3] num2=$[1+5] if test $[num1] -eq $[num2] then echo '两个数字相等!' else echo '两个数字不相等!' fi ``` 输出结果: ``` 两个数字相等! ``` ------ ## for 循环 与其他编程语言类似,Shell支持for循环。 for循环一般格式为: ``` for var in item1 item2 ... itemN do command1 command2 ... commandN done ``` 写成一行: ``` for var in item1 item2 ... itemN; do command1; command2… done; for var in item1 item2 ... itemN; do command1; command2… done; ``` 当变量值在列表里,for 循环即执行一次所有命令,使用变量名获取列表中的当前取值。命令可为任何有效的 shell 命令和语句。in 列表可以包含替换、字符串和文件名。 in列表是可选的,如果不用它,for循环使用命令行的位置参数。 例如,顺序输出当前列表中的数字: ## 实例 ```shell for loop in 1 2 3 4 5 do echo "The value is: $loop" done ``` 输出结果: ``` The value is: 1 The value is: 2 The value is: 3 The value is: 4 The value is: 5 ``` 顺序输出字符串中的字符: ``` #!/bin/bash for str in This is a string do echo $str done ``` 输出结果: ``` This is a string ``` ------ ## while 语句 while 循环用于不断执行一系列命令,也用于从输入文件中读取数据。其语法格式为: ``` while condition do command done ``` 以下是一个基本的 while 循环,测试条件是:如果 int 小于等于 5,那么条件返回真。int 从 1 开始,每次循环处理时,int 加 1。运行上述脚本,返回数字 1 到 5,然后终止。 ## 实例 ```shell #!/bin/bash int=1 while(( $int<=5 )) do echo $int let "int++" done ``` 运行脚本,输出: ``` 1 2 3 4 5 ``` 以上实例使用了 Bash let 命令,它用于执行一个或多个表达式,变量计算中不需要加上 $ 来表示变量,具体可查阅:[Bash let 命令](https://www.runoob.com/linux/linux-comm-let.html) 。 while循环可用于读取键盘信息。下面的例子中,输入信息被设置为变量FILM,按结束循环。 ## 实例 ````shell echo '按下 退出' echo -n '输入你最喜欢的网站名: ' while read FILM do echo "是的!$FILM 是一个好网站" done ```` 运行脚本,输出类似下面: ``` 按下 退出 输入你最喜欢的网站名:菜鸟教程 是的!菜鸟教程 是一个好网站 ``` ### 无限循环 无限循环语法格式: ``` while : do command done ``` 或者 ``` while true do command done ``` 或者 ``` for (( ; ; )) ``` ------ ## until 循环 until 循环执行一系列命令直至条件为 true 时停止。 until 循环与 while 循环在处理方式上刚好相反。 一般 while 循环优于 until 循环,但在某些时候—也只是极少数情况下,until 循环更加有用。 until 语法格式: ``` until condition do command done ``` condition 一般为条件表达式,如果返回值为 false,则继续执行循环体内的语句,否则跳出循环。 以下实例我们使用 until 命令来输出 0 ~ 9 的数字: ## 实例 ```shell #!/bin/bash a=0 until [ ! $a -lt 10 ] do echo $a a=`expr $a + 1` done ``` 运行结果: 输出结果为: ``` 0 1 2 3 4 5 6 7 8 9 ``` ------ ## case ... esac **case ... esac** 为多选择语句,与其他语言中的 switch ... case 语句类似, 是一种多分枝选择结构, - 每个 case 分支用右圆括号开始, - 用两个分号 **;;** 表示 break,即执行结束, - 跳出整个 case ... esac 语句,esac(就是 case 反过来)作为结束标记。 可以用 case 语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。 **case ... esac** 语法格式如下: ``` case 值 in 模式1) command1 command2 ... commandN ;; 模式2) command1 command2 ... commandN ;; esac ``` case 工作方式如上所示, - 取值后面必须为单词 **in**, - 每一模式必须以右括号结束。 - 取值可以为变量或常数,匹配发现取值符合某一模式后,其间所有命令开始执行直至 **;;**。 取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。 - 如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。 下面的脚本提示输入 1 到 4,与每一种模式进行匹配: ## 实例 ```shell echo '输入 1 到 4 之间的数字:' echo '你输入的数字为:' read aNum case $aNum in 1) echo '你选择了 1' ;; 2) echo '你选择了 2' ;; 3) echo '你选择了 3' ;; 4) echo '你选择了 4' ;; *) echo '你没有输入 1 到 4 之间的数字' ;; esac ``` 输入不同的内容,会有不同的结果,例如: ``` 输入 1 到 4 之间的数字: 你输入的数字为: 3 你选择了 3 ``` 下面的脚本匹配字符串: ## 实例 ```shell #!/bin/sh site="runoob" case "$site" in "runoob") echo "菜鸟教程" ;; "google") echo "Google 搜索" ;; "taobao") echo "淘宝网" ;; esac ``` 输出结果为: ``` 菜鸟教程 ``` ------ ## 跳出循环 在循环过程中,有时候需要在未达到循环结束条件时强制跳出循环,Shell使用两个命令来实现该功能:break和continue。 ### break命令 break命令允许跳出所有循环(终止执行后面的所有循环)。 下面的例子中,脚本进入死循环直至用户输入数字大于5。要跳出这个循环,返回到shell提示符下,需要使用break命令。 ## 实例 ```shell #!/bin/bash while : do echo -n "输入 1 到 5 之间的数字:" read aNum case $aNum in 1|2|3|4|5) echo "你输入的数字为 $aNum!" ;; *) echo "你输入的数字不是 1 到 5 之间的! 游戏结束" break ;; esac done ``` 执行以上代码,输出结果为: ``` 输入 1 到 5 之间的数字:3 你输入的数字为 3! 输入 1 到 5 之间的数字:7 你输入的数字不是 1 到 5 之间的! 游戏结束 ``` ### continue continue命令与break命令类似,只有一点差别,它不会跳出所有循环,仅仅跳出当前循环。 对上面的例子进行修改: ## 实例 *#!/bin/bash* **while** : **do** **echo** -n "输入 1 到 5 之间的数字: " **read** aNum **case** $aNum **in** 1**|**2**|**3**|**4**|**5**)** **echo** "你输入的数字为 $aNum!" **;;** *******)** **echo** "你输入的数字不是 1 到 5 之间的!" **continue** **echo** "游戏结束" **;;** **esac** **done** 运行代码发现,当输入大于5的数字时,该例中的循环不会结束,语句 **echo "游戏结束"** 永远不会被执行。 [Shell test 命令](https://www.runoob.com/linux/linux-shell-test.html) [Shell 函数](https://www.runoob.com/linux/linux-shell-func.html) ## 2 篇笔记 写笔记 1. 情空明月 moo***v@gmail.com 204 shell 中的 for 循环不仅可以用文章所述的方法。 对于习惯其他语言 for 循环的朋友来说可能有点别扭。 ``` for((assignment;condition:next));do command_1; command_2; commond_..; done; ``` 如上所示,这里的 for 循环与 C 中的相似,但并不完全相同。 通常情况下 shell 变量调用需要加 $,但是 for 的 (()) 中不需要,下面来看一个例子: ``` #!/bin/bash for((i=1;i<=5;i++));do echo "这是第 $i 次调用"; done; ``` 执行结果: ``` 这是第1次调用 这是第2次调用 这是第3次调用 这是第4次调用 这是第5次调用 ``` 与 C 中相似,赋值和下一步执行可以放到代码之前循环语句之中执行,这里要注意一点:如果要在循环体中进行 for 中的 next 操作,记得变量要加 $,不然程序会变成死循环。 [情空明月](javascript:;) 情空明月 moo***v@gmail.com3年前 (2018-02-27) 2. This_Is_Y Thi***s_Y@qq.com [ 参考地址](https://blog.csdn.net/liuqinglong_along/article/details/52191382) 11 从 ubuntu 6.10 开始,ubuntu 就将先前默认的 **bash shell** 更换成了**dash shell**,其表现为 **/bin/sh** 链接倒了 **/bin/dash** 而不是传统的 **/bin/bash**。 可以通过 **ls -l /bin/\*sh** 命令看到: ![img](https://img-blog.csdnimg.cn/img_convert/80183f1fb67f97e9c4e98e86abb9836f.png) 所以在使用 **sh** 命令执行脚本的时候实际使用的是 dash,而 dash 不支持这种 C 语言格式的 for 循环写法。 - centOs还是bash /bin/sh -> bash **解决方法:**使用 **bash** 代替 **sh** 运行脚本: ``` bash test.sh ``` [This_Is_Y](https://www.runoob.com/note/60772) This_Is_Y Thi***s_Y@qq.com [ 参考地址](https://blog.csdn.net/liuqinglong_along/article/details/52191382)1个月前 (01-18) # Shell 函数 linux shell 可以用户定义函数,然后在shell脚本中可以随便调用。 shell中函数的定义格式如下: ``` [ function ] funname [()] { action; [return int;] } ``` 说明: - 1、可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。 - 2、参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255 下面的例子定义了一个函数并进行调用: ``` #!/bin/bash # author:菜鸟教程 # url:www.runoob.com demoFun(){ echo "这是我的第一个 shell 函数!" } echo "-----函数开始执行-----" demoFun echo "-----函数执行完毕-----" ``` 输出结果: ``` -----函数开始执行----- 这是我的第一个 shell 函数! -----函数执行完毕----- ``` 下面定义一个带有return语句的函数: ``` #!/bin/bash # author:菜鸟教程 # url:www.runoob.com funWithReturn(){ echo "这个函数会对输入的两个数字进行相加运算..." echo "输入第一个数字: " read aNum echo "输入第二个数字: " read anotherNum echo "两个数字分别为 $aNum 和 $anotherNum !" return $(($aNum+$anotherNum)) } funWithReturn echo "输入的两个数字之和为 $? !" ``` 输出类似下面: ``` 这个函数会对输入的两个数字进行相加运算... 输入第一个数字: 1 输入第二个数字: 2 两个数字分别为 1 和 2 ! 输入的两个数字之和为 3 ! ``` - 函数返回值在调用该函数后通过 $? 来获得。 注意:所有函数在使用前必须定义。这意味着必须将函数放在脚本开始部分,直至shell解释器首次发现它时,才可以使用。调用函数仅使用其函数名即可。 ------ ## 函数参数 在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数... 带参数的函数示例: ``` #!/bin/bash # author:菜鸟教程 # url:www.runoob.com funWithParam(){ echo "第一个参数为 $1 !" echo "第二个参数为 $2 !" echo "第十个参数为 $10 !" echo "第十个参数为 ${10} !" echo "第十一个参数为 ${11} !" echo "参数总数有 $# 个!" echo "作为一个字符串输出所有参数 $* !" } funWithParam 1 2 3 4 5 6 7 8 9 34 73 ``` 输出结果: ``` 第一个参数为 1 ! 第二个参数为 2 ! 第十个参数为 10 ! 第十个参数为 34 ! 第十一个参数为 73 ! 参数总数有 11 个! 作为一个字符串输出所有参数 1 2 3 4 5 6 7 8 9 34 73 ! ``` 注意,$10 不能获取第十个参数,获取第十个参数需要${10}。当n>=10时,需要使用${n}来获取参数。 另外,还有几个特殊字符用来处理参数: | 参数处理 | 说明 | | :------- | :----------------------------------------------------------- | | $# | 传递到脚本或函数的参数个数 | | $* | 以一个单字符串显示所有向脚本传递的参数 | | $$ | 脚本运行的当前进程ID号 | | $! | 后台运行的最后一个进程的ID号 | | $@ | 与$*相同,但是使用时加引号,并在引号中返回每个参数。 | | $- | 显示Shell使用的当前选项,与set命令功能相同。 | | $? | 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。 | [Shell 流程控制](https://www.runoob.com/linux/linux-shell-process-control.html) [Shell 输入/输出重定向](https://www.runoob.com/linux/linux-shell-io-redirections.html) ## 2 篇笔记 写笔记 1. 乱码kun ly1***657282@gmail.com 129 **$?** 仅对其上一条指令负责,一旦函数返回后其返回值没有立即保存入参数,那么其返回值将不再能通过 **$?** 获得。 测试代码: ``` #!/bin/bash function demoFun1(){ echo "这是我的第一个 shell 函数!" return `expr 1 + 1` } demoFun1 echo $? function demoFun2(){ echo "这是我的第二个 shell 函数!" expr 1 + 1 } demoFun2 echo $? demoFun1 echo 在这里插入命令! echo $? ``` 输出结果: ``` 这是我的第一个 shell 函数! 2 这是我的第二个 shell 函数! 2 0 这是我的第一个 shell 函数! 在这里插入命令! 0 ``` 调用 demoFun2 后,函数最后一条命令 expr 1 + 1 得到的返回值($?值)为 0,意思是这个命令没有出错。所有的命令的返回值仅表示其是否出错,而不会有其他有含义的结果。 第二次调用 demoFun1 后,没有立即查看 $? 的值,而是先插入了一条别的 echo 命令, - 最后再查看 $? 的值得到的是 0, - 也就是上一条 echo 命令的结果,而 demoFun1 的返回值被覆盖了。 下面这个测试,连续使用两次 **echo $?**,得到的结果不同,更为直观: ``` #!/bin/bash function demoFun1(){ echo "这是我的第一个 shell 函数!" return `expr 1 + 1` } demoFun1 echo $? echo $? ``` 输出结果: ``` 这是我的第一个 shell 函数! 2 0 ``` [乱码kun](javascript:;) 乱码kun ly1***657282@gmail.com2年前 (2019-07-13) 2. 乱码kun ly1***657282@gmail.com 90 函数与命令的执行结果可以作为条件语句使用。要注意的是,和 C 语言不同,shell 语言中 0 代表 true,0 以外的值代表 false。 请参见下例: ```shell #!/bin/bash echo "Hello World !" | grep -e Hello echo $? #grep是查询,查询到 返回 0,并打印输出 echo "Hello World !" | grep -e Bye echo $? #查询不到,这里返回1 if echo "Hello World !" | grep -e Hello then echo true else echo false fi #输出的结果是:Hello World ! # true if echo "Hello World !" | grep -e Bye then echo true else echo false fi # 为 false function demoFun1(){ return 0 } function demoFun2(){ return 12 } if demoFun1 then echo true else echo false fi #打印 true,0是 if demoFun2 then echo ture else echo false fi #打印 false ,其他是 ``` 其执行结果如下: ``` Hello World ! 0 1 Hello World ! true false true false ``` grep 是从给定字符串中寻找匹配内容的命令。首先看出如果找到了匹配的内容,会打印匹配部分且得到的返回值 $? 为 0,如果找不到,则返回值 $? 为 1。 接下来分别将这两次执行的 grep 命令当作条件语句交给 if 判断,得出返回值 $? 为 0,即执行成功时,条件语句为 true,当返回值 $? 为 1,即执行失败时,条件语句为 false。 之后再用函数的 return 值作为测试,其中 demoFun1 返回值为 0,demoFun2 返回值选择了任意一个和 0 不同的整数,这里为 12。 将函数作为条件语句交给 if 判断,得出返回值为 0 时,依然为 true,而返回值只要不是 0,条件语句都判断为 false。 [乱码kun](javascript:;) 乱码kun ly1***657282@gmail.com2年前 (2019-07-16) # Shell 输入/输出重定向 大多数 UNIX 系统命令 - 从你的终端接受输入 并将所产生的输出 发送回到您的终端。 - 一个命令通常从一个叫标准输入的地方读取输入,默认情况下,这恰好是你的终端。 - 同样,一个命令通常将其输出写入到标准输出,默认情况下,这也是你的终端。 重定向命令列表如下: | 命令 | 说明 | | :-------------- | :------------------------------------------------- | | command > file | 将输出重定向到 file。 | | command < file | 将输入重定向到 file。 | | command >> file | 将输出以追加的方式重定向到 file。 | | n > file | 将文件描述符为 n 的文件重定向到 file。 | | n >> file | 将文件描述符为 n 的文件以追加的方式重定向到 file。 | | n >& m | 将输出文件 m 和 n 合并。 | | n <& m | 将输入文件 m 和 n 合并。 | | << tag | 将开始标记 tag 和结束标记 tag 之间的内容作为输入。 | > 需要注意的是文件描述符 0 通常是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)。 ------ ## 输出重定向 重定向一般通过在命令间插入特定的符号来实现。特别的,这些符号的语法如下所示: ``` command1 > file1 ``` 上面这个命令执行command1然后将输出的内容存入file1。 注意任何file1内的已经存在的内容将被新内容替代。如果要将新内容添加在文件末尾,请使用>>操作符。 ### 实例 执行下面的 who 命令,它将命令的完整的输出重定向在用户文件中(users): ``` $ who > users ``` 执行后,并没有在终端输出信息,这是因为输出已被从默认的标准输出设备(终端)重定向到指定的文件。 你可以使用 cat 命令查看文件内容: ``` $ cat users _mbsetupuser console Oct 31 17:35 tianqixin console Oct 31 17:35 tianqixin ttys000 Dec 1 11:33 ``` 输出重定向会覆盖文件内容,请看下面的例子: ``` $ echo "菜鸟教程:www.runoob.com" > users $ cat users 菜鸟教程:www.runoob.com $ ``` 如果不希望文件内容被覆盖,可以使用 >> 追加到文件末尾,例如: ``` $ echo "菜鸟教程:www.runoob.com" >> users $ cat users 菜鸟教程:www.runoob.com 菜鸟教程:www.runoob.com $ ``` ------ ## 输入重定向 和输出重定向一样,Unix 命令也可以从文件获取输入,语法为: ``` command1 < file1 ``` 这样,本来需要从键盘获取输入的命令会转移到文件读取内容。 注意:输出重定向是大于号(>),输入重定向是小于号(<)。 ### 实例 接着以上实例,我们需要统计 users 文件的行数,执行以下命令: ``` $ wc -l users 2 users ``` 也可以将输入重定向到 users 文件: ``` $ wc -l < users 2 ``` 注意:上面两个例子的结果不同:第一个例子,会输出文件名;第二个不会, - 因为它仅仅知道从标准输入读取内容。 ``` command1 < infile > outfile wc -l < users >>users ``` 同时替换输入和输出,执行command1,从文件infile读取内容,然后将输出写入到outfile中。 ### 重定向深入讲解 一般情况下,每个 Unix/Linux 命令运行时都会打开三个文件: - 标准输入文件(stdin):stdin的文件描述符为0,Unix程序默认从stdin读取数据。 - 标准输出文件(stdout):stdout 的文件描述符为1,Unix程序默认向stdout输出数据。 - 标准错误文件(stderr):stderr的文件描述符为2,Unix程序会向stderr流中写入错误信息。 默认情况下,command > file 将 stdout 重定向到 file,command < file 将stdin 重定向到 file。 如果希望 stderr 重定向到 file,可以这样写: ``` $ command 2>file ``` 如果希望 stderr 追加到 file 文件末尾,可以这样写: ``` $ command 2>>file ``` **2** 表示标准错误文件(stderr)。 如果希望将 stdout 和 stderr 合并后重定向到 file,可以这样写: ``` $ command > file 2>&1 或者 $ command >> file 2>&1 ``` 如果希望对 stdin 和 stdout 都重定向,可以这样写: ``` $ command < file1 >file2 ``` command 命令将 stdin 重定向到 file1,将 stdout 重定向到 file2。 ------ ## Here Document Here Document 是 - Shell 中的一种特殊的重定向方式, - 用来将 输入重定向到 一个交互式 Shell 脚本或程序。 它的基本的形式如下: ``` command << delimiter document delimiter ``` 它的作用是将两个 delimiter 之间的内容(document) 作为输入传递给 command。 > 注意: > > - 结尾的delimiter 一定要顶格写,前面不能有任何字符,后面也不能有任何字符,包括空格和 tab 缩进。 > - 开始的delimiter前后的空格会被忽略掉。 ### 实例 在命令行中通过 **wc -l** 命令计算 Here Document 的行数: ``` $ wc -l << EOF 欢迎来到 菜鸟教程 www.runoob.com EOF 3 # 输出结果为 3 行 $ ``` 我们也可以将 Here Document 用在脚本中,例如: ``` #!/bin/bash # author:菜鸟教程 # url:www.runoob.com cat << EOF 欢迎来到 菜鸟教程 www.runoob.com EOF ``` 执行以上脚本,输出结果: ``` 欢迎来到 菜鸟教程 www.runoob.com ``` ------ ## /dev/null 文件 如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/null: ``` $ command > /dev/null ``` /dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。但是 /dev/null 文件非常有用,将命令的输出重定向到它,会起到"禁止输出"的效果。 如果希望屏蔽 stdout 和 stderr,可以这样写: ``` $ command > /dev/null 2>&1 ``` > **注意:**0 是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)。 > > 这里的 **2** 和 **>** 之间不可以有空格,**2>** 是一体的时候才表示错误输出。 [Shell 函数](https://www.runoob.com/linux/linux-shell-func.html) [Shell 文件包含](https://www.runoob.com/linux/linux-shell-include-file.html) # Shell 文件包含 和其他语言一样,Shell 也可以包含外部脚本。这样可以很方便的封装一些公用的代码作为一个独立的文件。 Shell 文件包含的语法格式如下: ``` . filename # 注意点号(.)和文件名中间有一空格 或 source filename ``` ### 实例 创建两个 shell 脚本文件。 test1.sh 代码如下: ``` #!/bin/bash # author:菜鸟教程 # url:www.runoob.com url="http://www.runoob.com" ``` test2.sh 代码如下: ``` #!/bin/bash # author:菜鸟教程 # url:www.runoob.com #使用 . 号来引用test1.sh 文件 . ./test1.sh # 或者使用以下包含文件代码 # source ./test1.sh echo "菜鸟教程官网地址:$url" ``` 接下来,我们为 test2.sh 添加可执行权限并执行: ``` $ chmod +x test2.sh $ ./test2.sh 菜鸟教程官网地址:http://www.runoob.com ``` > **注:**被包含的文件 test1.sh 不需要可执行权限。 [Shell 输入/输出重定向](https://www.runoob.com/linux/linux-shell-io-redirections.html) [Linux 命令大全](https://www.runoob.com/linux/linux-command-manual.html)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值