shell脚本语句语法使用(超详细)

博文大纲:

  • 1、对谈式脚本——read语句
  • 2、shell脚本中的测试的字符
  • 3、判断脚本举例
  • 4、条件判断——if语句
  • 5、条件判断——case语句
  • 6、条件判断——function函数结合case语句
  • 7、循环判断——while、until语句
  • 8、固定循环——for...do...done语句
  • 9、循环——cut、set结合for语句
  • 10、其他脚本类型举例
  • 11、shell脚本的追踪与debug

shell脚本的编写越规范越好,那么通常在每个shell脚本的开头几行会有如下几个方面相关的注释信息:

  • 脚本使用的shell,如/bin/bash;
  • 脚本的版本信息;
  • 脚本的作者与联络方式;
  • 脚本的history(编写时间记录);
  • 脚本内较特殊的指令,使用绝对路径的方式来下达;
  • 脚本运行是需要的环境变量预先宣告与设置。

废话不多说,直接上使用语法案例:

1、对谈式脚本——read语句

shell变量除了可以直接赋值或脚本传参外,还可以使用read命令从标准输入中获得,read是bash内置命令,可以使用help read查看帮助。

read的读入功能就相当于交互式接受用户输入,然后给变量赋值。

常用参数如下:

  • -p: 设置提示信息。
  • -t:设置输入等待的时间,单位默认是秒。

使用举例
基本使用:

[root@localhost ~]# read -t 10 -p "qing shu ru:" num #读入一个输入,赋值给num,num变量前要空格。# -t  10则表示10秒后就超时退出qing shu ru:34      #输入34[root@localhost ~]# echo ${num}      #输出变量值34[root@localhost ~]# read -p "qing shu ru:" a1 a2    #也可以一次定义两个变量qing shu ru:23 45[root@localhost ~]# echo ${a1} ${a2}23 45

需求①:
first name 与 2. last name,最后并且在屏幕上显示:“Your full name is: ”的内容:

[root@localhost ~]# vim 1.sh   #编辑脚本,内容如下#!/bin/bashecho -e "yong lai xian shi wen jian full name:\n"read -p "qing shu ru fir filename:" firnameread -p "qing shu ru sec filename:" secnameecho -e "\nyour full name is ${firname}${secname}."#其中echo后面的“\n”表示换行[root@localhost ~]# sh 1.sh      #执行脚本yong lai xian shi wen jian full name:qing shu ru fir filename:xie         #手动输入文件名开头qing shu ru sec filename:feng         #手动输入文件名结尾your full name is xiefeng.     #它将自动将开头和结尾结合起来并输出

需求②:
假设我想要创建三个空的文件(通过touch),filename最开头由当前用户输入决定,假设使用者输入 filename 好了,那今天的日期是 2021/03/29 ,我想要以前天、昨天、今天的日期来创建这些文件。

[root@localhost ~]# vim 2.sh     #编辑脚本#!/bin/bashecho -e "yi ci chuang jian san ge file.\n"read -p "qing shu ru filename:" filenamefilename=${filename:-file}date1=$(date --date '1 days ago' +%Y%m%d)date2=$(date --date '2 days ago' +%Y%m%d)date3=$(date +%Y%m%d)file1="${filename}${date1}"file2="${filename}${date2}"file3="${filename}${date3}"touch "${file1}"touch "${file2}"touch "${file3}"[root@localhost ~]# sh 2.sh   #执行脚本yi ci chuang jian san ge file.qing shu ru filename:xie           #输入自定义的文件名开头[root@localhost ~]# find /root -name "xie*"   #查看是否创建成功/root/lv20210329/root/lv20210331/root/lv20210330

需求③:
如果我们要使用者输入两个变量,然后将两个变量的内容相乘,最后输出相乘的结果。

[root@localhost ~]# vim 3.sh      #编辑脚本#!/bin/bashecho -e "\nzhe shi yi ge suan cheng fa de jiao ben:\n"read -p "qing shu ru yi ge shu zi:" Aread -p "qing shu ru di er ge shu zi:" Bsum=`echo "scale=4; ${A} * ${B}" | bc`echo -e "\n${A}x${B} ==> ${sum}."[root@localhost ~]# sh 3.sh        #执行脚本zhe shi yi ge suan cheng fa de jiao ben:qing shu ru yi ge shu zi:3        #输入第一个数qing shu ru di er ge shu zi:4     #输入第二个数3x4 ==> 12.                           #输出的结果

2、shell脚本中的测试的字符





上面所有的测试都是通过test进行的,可以使用“[ ]”来代替,将要测试的类型及指定的名字写在“[ ]” 即可,但是中括号里面两边必须有空格。(推荐使用中括号“[ ]”)

3、判断脚本举例

需求①:

  1. 这个文件是否存在,若不存在则给予一个“Filename does not exist”的讯息,并中断程序;
  2. 若这个文件存在,则判断他是个文件或目录,结果输出“Filename is regular file”或“Filename is directory”
  3. 判断一下,执行者的身份对这个文件或目录所拥有的权限,并输出权限数据!
[root@localhost ~]# vim 4.sh     #编辑脚本#!/bin/bashecho "yong lai ce shi wen jian huo dirctory."read -p "qing shu ru yi ge wen jian ming:" filenametest -z ${filename} && echo -e "\nqing shu ru yi ge filename." && exit 0test ! -e ${filename} && echo "filename does not exitst." && exit 0test -f ${filename} && filetype="file"test -d ${filename} && filetype="directory"test -r ${filename} && prem="read"test -w ${filename} && prem="${prem}+write"test -x ${filename} && prem="${prem}+exe"echo -e "\nthis is a ${filetype},it's perm.. is ${prem}."[root@localhost ~]# sh 4.sh      #执行脚本yong lai ce shi wen jian huo dirctory.qing shu ru yi ge wen jian ming:/root    #输入一个目录名this is a directory,it's perm.. is read+write+exe.      #脚本执行后输出的结果[root@localhost ~]# sh 4.sh     #再执行脚本yong lai ce shi wen jian huo dirctory.qing shu ru yi ge wen jian ming:/etc/passwd      #输入一个文件this is a file,it's perm.. is read+write.       #脚本执行后输出的结果

需求②:

1、当执行一个程序的时候,这个程序会让用户输入Y或N。
2、如果使用者输入Y或y时,就会显示OK,continue.
3、如果使用者输入N或n时,就会显示ON,interrupt.
4、如果不是Y/y/N/n之内的字符,那么将会死循环这个脚本,直到手动退出,或输入正确的值(其实稍作改动,可以改为若默认按回车的话可以等于输入“Y”,自行研究吧)。

[root@localhost ~]# vim 5.sh     #编辑脚本#!/bin/bashwhile [ "${yn}" != "Y" -o "${yn}" != "y" -o "${yn}" != "N" -o "${yn}" != "n" ]doread -p "qing shu ru 'Y' or 'N':" yn[ "${yn}" == "Y" -o "${yn}" == "y" -o "${yn}" == "" ] && echo -e "\nOK,continue." && exit 0[ "${yn}" == "N" -o "${yn}" == "n" ] && echo -e "\nON,interrupt." && exit 0done[root@localhost ~]# sh 5.sh     #下面是多次执行脚本,测试是否达到需求qing shu ru 'Y' or 'N':OK,continue.[root@localhost ~]# sh 5.sh qing shu ru 'Y' or 'N':yOK,continue.[root@localhost ~]# sh 5.shqing shu ru 'Y' or 'N':nON,interrupt.[root@localhost ~]# sh 5.shqing shu ru 'Y' or 'N':uqing shu ru 'Y' or 'N':iqing shu ru 'Y' or 'N':NON,interrupt.

需求③:
1、程序的文件名为何?
2、共有几个参数?
3、若参数的个数小于 2 则告知使用者参数数量太少
4、全部的参数内容为何?
5、第一个参数为何?
6、第二个参数为何

[root@localhost ~]# vim 6.sh     #编辑脚本如下#!/bin/bashecho -e "\ncheng xu de wen jian ming shi ${0}"echo -e "\nyi gong you $# ge can shu."[ $# -lt 2 ] && echo "can shu tai shao le ." && exit 0echo  "your whole parameter is ==> '$*'."echo "the 1st parameter ${1}."echo "the 2nd parameter ${2}."[root@localhost ~]# sh 6.sh a b c     #执行脚本cheng xu de wen jian ming shi 6.shyi gong you 3 ge can shu.your whole parameter is ==> 'a b c'.the 1st parameter a.the 2nd parameter b.[root@localhost ~]# sh 6.sh a      #再次执行脚本cheng xu de wen jian ming shi 6.shyi gong you 1 ge can shu.can shu tai shao le .#为了不为难自己,上面我用了拼音,多多体谅[ 捂脸 ]。

需求④:
查看本机都是否开启了www / ftp / mail服务,并将结果直观的显示出来

[root@localhost ~]# vim 11.sh #!/bin/bashfile="/dev/shm/a.txt"netstat -anpt  > ${file}awk -F : '{print $4}' ${file} | awk '{print $1}' | grep "80" &> /dev/nullif [ $? -eq 0 ]        then        echo -e "www service is up\n"fiawk '{print $4}' ${file} | egrep "20|21" &> /dev/nullif [ $? -eq 0 ]        then        echo -e "ftp service is up\n"fiawk '{print $4}' ${file} | grep "25" &> /dev/nullif [ $? -eq 0 ]        then        echo -e "mail service is up\n"fi[root@localhost ~]# sh 11.sh     #执行脚本测试mail service is up[root@localhost ~]# systemctl start httpd    #启动www服务再测试[root@localhost ~]# sh 11.sh www service is upmail service is up

需求⑤:
都知道脚本后面的第一段是$1,第二段是$2....那么是否可以进行偏移呢,假设让原本的$2变为$1。

[root@localhost ~]# vim 7.sh      #编辑脚本如下#!/bin/bashecho "total parameter number is ==> $#"echo "your whole parameter is ==> $* "shiftecho "total parameter number is ==> $#"echo "your whole parameter is ==> $* "shift 3echo "total parameter number is ==> $#"echo "your whole parameter is ==> $* "#“上面默认的shift”参数是偏移1个位置,也可以指定偏移的参数,如“shift 3”则表示向后偏移三个[root@localhost ~]# sh 7.sh a b c    #执行脚本,并且追加三个参数total parameter number is ==> 3your whole parameter is ==> a b c total parameter number is ==> 2your whole parameter is ==> b c total parameter number is ==> 2your whole parameter is ==> b c #从输出结果可以发现,偏移是累加的,第一次偏移了默认1位,#第二次偏移了3位,那么实际已经偏移了原始参数的4位(因为累加)#但是参数只有三个,所以它会循环偏移,所以结果还是b和c。

关于上面脚本中的“$#”、“$*”的解释可以参考如下解释:

4、条件判断——if语句

需求①:

1、当执行一个程序的时候,这个程序会让用户输入Y或N。
2、如果使用者输入Y或y或者直接按下回车键时,就会显示OK,continue.
3、如果使用者输入N或n时,就会显示ON,interrupt.
4、如果不是Y/y/N/n之内的字符,那么将输出“I don't know what your choice is”

[root@localhost ~]# vim 66.sh     #编写脚本#!/bin/bashread -p "Please input (Y/N): " ynif [ "${yn}" == "Y" -o "${yn}" == "y" -o "${yn}" == "" ];        then           echo "OK, continue"            exit 0elif [ "${yn}" == "N" -o "${yn}" == "n" ];         then           echo "ON, interrupt!"            exit 0        else           echo "I don't know what your choice is"fi[root@localhost ~]# sh 66.sh    #多次执行,进行测试Please input (Y/N): OK, continue[root@localhost ~]# sh 66.sh Please input (Y/N): nON, interrupt![root@localhost ~]# sh 66.sh Please input (Y/N): ddI don't know what your choice is

需求②:

判断192.168.1.0-10的主机存活,测试是否可以ping通,并输出IP地址对应的主机是“up”还是“down”,两种实现方法,如下:
方法1:

[root@localhost ~]# vim 8.sh     #编写脚本#!/bin/bashi=0network=192.168.1.while [ ${i} -le 10 ]do          ping -c 3 -i 0.2 -w 3 ${network}${i} &> /dev/nullif [ $? -eq 0 ]        then          echo "host ${network}${i} is up"        else          echo "host ${network}${i} is down"fi         let i++done[root@localhost ~]# sh 8.sh      #执行脚本host 192.168.1.0 is downhost 192.168.1.1 is downhost 192.168.1.2 is uphost 192.168.1.3 is downhost 192.168.1.4 is downhost 192.168.1.5 is downhost 192.168.1.6 is downhost 192.168.1.7 is downhost 192.168.1.8 is uphost 192.168.1.9 is downhost 192.168.1.10 is down

方法2:

[root@localhost ~]# vim 21.sh      #脚本内容如下#!/bin/bashnetwork="192.168.1."for host in $(seq 1 10)doping -c 1 -w 1 ${network}${host} &> /dev/nullif [ $? -eq 0 ]        then          echo "${network}${host} is up."else        echo "${network}${host} is down."fidone[root@localhost ~]# sh 21.sh     #执行脚本192.168.1.1 is down.0

需求③:

1、判断 $1 是否为 hello,如果是的话,就显示 "Hello, how are you ?";
2.、如果没有加任何参数,就提示使用者必须要使用的参数下达法;
3、 而如果加入的参数不是 hello ,就提醒使用者仅能使用 hello 为参数。

[root@localhost ~]# vim 10.sh        #编写脚本#!/bin/bashif [ "${1}" == "hello" ]        then          echo "hello,how are you ?"          exit 0elif [ "${1}" == "" ]        then          echo "qing shi yong zi fu 'hello'."          exit 0else          echo "jin neng shi yong hello zi fu." fi[root@localhost ~]# sh 10.sh              #多次执行进行测试qing shi yong zi fu 'hello'.[root@localhost ~]# sh 10.sh  hejin neng shi yong hello zi fu.[root@localhost ~]# sh 10.sh  hellohello,how are you ?

5、条件判断——case语句

需求①:

1、判断 $1 是否为 hello,如果是的话,就显示 "Hello, how are you ?";
2.、如果没有加任何参数,就提示使用者必须要使用的参数下达法;
3、 而如果加入的参数不是 hello ,就提醒使用者仅能使用 hello 为参数。

[root@localhost ~]# vim 12.sh        #编写脚本#!/bin/bashcase ${1} in"hello")echo "Hello, how are you ?";;"")echo "You MUST input parameters, ex> {${0} someword}" ;;*)echo "Usage ${0} {hello}" ;;esac[root@localhost ~]# sh 12.sh hello     #多次执行,进行测试Hello, how are you ?[root@localhost ~]# sh 12.sh hellUsage 12.sh {hello}[root@localhost ~]# sh 12.sh You MUST input parameters, ex> {12.sh someword}

需求②:
让使用者能够输入 one, two, three ,并且将使用者的变量显示到屏幕上,如果不是 one, two, three 时,就告知使用者仅有这三种选择。

[root@localhost ~]# vim 13.sh      #编写脚本#!/bin/bashecho "qing shu ry one two three."read -p "qing shu ru:" shuzicase $shuzi in"one")        echo "bian liang shi $shuzi";;"two")        echo "bian liang shi $shuzi";;"three")        echo "bian liang shi $shuzi";;*)        echo "only neng shu ru one|two|three";;esac[root@localhost ~]# sh 13.sh       #多次执行,进行测试qing shu ry one two three.qing shu ru:one           #根据提示输入字符bian liang shi one[root@localhost ~]# sh 13.sh    #多次执行,进行测试qing shu ry one two three.qing shu ru:two         #根据提示输入字符bian liang shi two[root@localhost ~]# sh 13.sh     #多次执行,进行测试qing shu ry one two three.qing shu ru:ddd         #根据提示输入字符only neng shu ru one|two|three

6、条件判断——function函数结合case语句

需求②:
让使用者能够输入 one, two, three ,并且将使用者的变量以大写的方式显示到屏幕上,如果不是 one, two, three 时,就告知使用者仅有这三种选择。

[root@localhost ~]# vim 14.sh function aaa(){        echo -n  "this is  "}case $1 inone)aaa        echo "$1." | tr 'a-z' 'A-Z';;two)aaa        echo "$1." | tr 'a-z' 'A-Z';;three)aaa        echo "$1." | tr 'a-z' 'A-Z';;*)        echo "qing shu ru {one|two|three}.";;esac[root@localhost ~]# sh 14.sh     #执行进行测试qing shu ru {one|two|three}.[root@localhost ~]# sh 14.sh one     #再次执行this is  ONE.

关于function函数的解释举例:
假如下达:“ sh show123-2.sh one ” 这表示在 脚本内的 $1 为 "one" 这个字串。但是在 printit()内的 $1 则与这个 one 无关。

如下:

[root@localhost ~]# vim 15.sh #!/bin/bashfunction printit(){        echo "Your choice is ${1}" }case ${1} in"one")printit 1 11;;"two")printit 2 22;;"three")printit 3 33;;*)echo "Usage ${0} {one|two|three}" ;;esac[root@localhost ~]# sh 15.sh one    #多次执行进行测试,以便查看输出的$1是哪里的值Your choice is 1[root@localhost ~]# sh 15.sh twoYour choice is 2#若将下面的变量改为$2,那么将会输出11、22、33等,发现这里的${变量}是引用的哪里的了么?function printit(){        echo "Your choice is ${2}" }#自行测试吧!

7、循环判断——while、until语句

需求①——while语句
假设我要让使用者输入 yes 或者是 YES 才结束程序的执行,否则就一直进行告知使用者输入字串。

[root@localhost ~]# vim 16.sh     #编写脚本#!/bin/bashwhile [ "${yn}" != "yes" -a "${yn}" != "YES" ]doread -p "Please input yes/YES to stop this program: " yndoneecho "OK! you input the correct answer."[root@localhost ~]# sh 16.sh      #执行脚本测试Please input yes/YES to stop this program: yesOK! you input the correct answer.[root@localhost ~]# sh 16.sh      #执行脚本测试Please input yes/YES to stop this program: ddPlease input yes/YES to stop this program: fPlease input yes/YES to stop this program: YESOK! you input the correct answer.

需求②——until语句
与上面的需求一样,只是换成until语句。

[root@localhost ~]# vim 17.sh      #编写脚本如下#!/bin/bashuntil [ "${yn}" == "yes" -o "${yn}" == "YES" ]do        read -p "qing shu ru 'yes' or 'YES':" yndoneecho "OK!!!"[root@localhost ~]# sh 17.sh     #多次执行进行测试qing shu ru 'yes' or 'YES':yesOK!!![root@localhost ~]# sh 17.sh      #多次执行进行测试qing shu ru 'yes' or 'YES':dfqing shu ru 'yes' or 'YES':YESOK!!!#不难发现,until与while正好相反,until是某个测试条件成立,则不循环;#while是如果某个测试条件成立,则循环

需求③
求1到100的累积相加的和。
这个题目还是比较经典又简单的,如下(实现的方法有很多,自行研究吧):
方法1:

[root@localhost ~]# vim 18.sh     #编辑脚本#!/bin/bashi=0sum=0while [ ${i} -lt 100 ]do        i=$(( ${i}+1 ))        sum=$(( ${sum}+${i} ))doneecho "1+2+3+4....+100 de jie guo shi ${sum}."[root@localhost ~]# sh 18.sh     #执行脚本1+2+3+4....+100 de jie guo shi 5050.       #5050就是结果

方法2:

[root@localhost ~]# vim 18.sh      #脚本内容如下#!/bin/bashi=0while [ ${i} -le 100 ]do        sum=$(( ${sum}+${i} ))        let i++doneecho "1+2+3+4....+100 de jie guo shi ${sum}."[root@localhost ~]# sh 18.sh      #执行脚本1+2+3+4....+100 de jie guo shi 5050.

方法3(比前两种方式更加智能些,可以以交互式的方式,指定累积加到某个数字):

[root@localhost ~]# vim 23.sh      #内容如下#!/bin/bashread -p "Please input a number, I will count for 1+2+...+your_input:" nus="0"for ((i=1;i<=${nu}; i++))dos=$((${s}+${i}))doneecho "the result of '1+2+...+${nu}' is ==> ${s}"[root@localhost ~]# sh 23.sh     #执行Please input a number, I will count for 1+2+...+your_input:100    #输入100the result of '1+2+...+100' is ==> 5050     #执行后输出的结果[root@localhost ~]# sh 23.sh        #再执行Please input a number, I will count for 1+2+...+your_input:99   #累积加到99the result of '1+2+...+99' is ==> 4950     #执行后输出的结果

8、固定循环——for...do...done语句

需求①

第一次循环时, $name 的内容为 内容1 ;
第二次循环时, $name的内容为 内容2 ;
第三次循环时, $name的内容为 内容3 ;
实现该需求有两种方法,若需要循环的内容较多,建议采用方法1。
方法1:

[root@localhost ~]# vim 19.sh      #编写脚本文件#!/bin/bashname=`cat /dongwu.txt`for names in ${name}doecho "There are ${names}s.... "done[root@localhost ~]# vim /dongwu.txt     #编写脚本中指定的文件dogcatelephant[root@localhost ~]# sh 19.sh     #执行并查看是否将上面文件中的内容依次输出There are dogs.... There are cats.... There are elephants.... 

方法2:

[root@localhost ~****]# vim 19.sh     #编写脚本文件#!/bin/bashfor name in dogs cats elephantsdoecho "There are ${name}s.... "done[root@localhost ~]# sh 19.sh     #执行脚本There are dogss.... There are catss.... There are elephantss.... 

9、循环——cut、set结合for语句

需求①
由于系统上面的各种帐号都是写在/etc/passwd 内的第一个字段,那么怎么通过管线命令的cut捉出单纯的帐号名称后,以id分别检查使用者的识别码与特殊参数呢?

脚本如下:

[root@localhost ~]# vim 20.sh     #编写脚本#!/bin/bashusers=`cut -d ':' -f1 /etc/passwd`for username in ${users}doid ${username}done[root@localhost ~]# sh 20.sh      #执行脚本uid=0(root) gid=0(root) 组=0(root)uid=1(bin) gid=1(bin) 组=1(bin)uid=2(daemon) gid=2(daemon) 组=2(daemon)uid=3(adm) gid=4(adm) 组=4(adm)uid=4(lp) gid=7(lp) 组=7(lp)           ........................#省略部分内容

10、其他脚本类型举例

需求1:
让用户输入某个目录文件名,然后自动找出某目录内的文件名的权限。

[root@localhost ~]# vim 22.sh     #脚本内容如下#!/bin/bashread -p "qing shu ru yi ge dirctory name:" dirnameif [ "${dirname}" == "" -o ! -d "${dirname}" ]        then           echo "qing shu ru zheng que de dirctroy name."           exit 1fifilelist=`ls ${dirname}`for filename in ${filelist}do[ -r ${filename} ] && perm="read"[ -w ${filename} ] && perm="${perm}+write"[ -x ${filename} ] && perm="${perm}+exe"echo "${filename} de quan xian shi ${perm}."done[root@localhost ~]# sh 22.sh     #执行脚本qing shu ru yi ge dirctory name:/root     #根据提示指定一个目录10.sh de quan xian shi read+write.11.sh de quan xian shi read+write.12.sh de quan xian shi read+write.13.sh de quan xian shi read+write.14.sh de quan xian shi read+write.15.sh de quan xian shi read+write.16.sh de quan xian shi read+write.17.sh de quan xian shi read+write.18.sh de quan xian shi read+write.19.sh de quan xian shi read+write.1.sh de quan xian shi read+write+exe.            ...................#省略部分内容

需求2:

搭配乱数来挑选(相当于抛硬币),这里比如说不知道要吃什么,执行以下脚本来决定吃什么。

[root@localhost ~]# vim 24.sh      #内容如下,11、22....假设为食物代号#!/bin/basheat[1]="11"eat[2]="22"eat[3]="33"eat[4]="44"eat[5]="55"eat[6]="66"eat[7]="77"eat[8]="88"eat[9]="99"eatnum=9check=`echo "${RANDOM} % 10" | bc `echo "your may eat ${eat[${check}]}"[root@localhost ~]# sh 24.sh     #多次执行,进行测试,会发现每次输出的结果都不一样your may eat 22[root@localhost ~]# sh 24.sh your may eat 55[root@localhost ~]# sh 24.sh your may eat 99

11、shell脚本的追踪与debug

****用法:

[root@localhost ~]# sh -n 5.sh      #如果语法没问题,则不会有任何输出[root@localhost ~]# sh -n 5.sh     #故意写错后,再测试5.sh:行3: 未预期的符号 `do' 附近有语法错误5.sh:行3: `do'[root@localhost ~]# sh -x 6.sh        #将6.sh的执行过程都显示出来+ echo -e '\ncheng xu de wen jian ming shi 6.sh'cheng xu de wen jian ming shi 6.sh+ echo -e '\nyi gong you 0 ge can shu.'yi gong you 0 ge can shu.+ '[' 0 -lt 2 ']'+ echo 'can shu tai shao le .'can shu tai shao le .+ exit 0

———————— 本文至此结束,感谢阅读 ————————

©著作权归作者所有:来自51CTO博客作者mb5c7bb57d7f7e8的原创作品,如需转载,请注明出处,否则将追究法律责任