php 的echo 运行shell_shell echo $? 判断运行结果 - CSDN
精华内容
参与话题
  • 当我们在一个 shell运行一个脚本程序时,该 shell 就会 fork 出一个新进程,从而启动了另一个命令解释器(由脚本中第一行的 #!/bin/xxx 指定,如 bash shell)来解释运行我们这个脚本。也就是说,这个新进程是一...
    当我们在一个 shell 里运行一个脚本程序时,该 shell 就会 fork 出一个新进程,从而启动了另一个命令解释器(由脚本中第一行的 #!/bin/xxx 指定,如 bash shell)来解释运行我们这个脚本。也就是说,这个新进程是一个子 shell,而之前的 shell 是个父 shell 。

    在我们所运行的脚本里,我们还可以启动新的子 shell 进程,这些子 shell 进程使脚本并行地运行着多个子任务。一般而言,在一个脚本里执行一个外部命令(普通的可执行文件)时,shell 会 fork 出一个子进程,然后再用 exec 来执行这个程序;但是,bash shell 的内置命令(builtin)却不会这样,它们是直接执行的。所以,等价的内置命令的执行速度会比执行外部命令要来的快。

    在一对括号 (...) 里可以放置一组指令,这些指令是在一个子 shell 里执行的。在子 shell 里的变量不能被这段子 shell 外的代码直接访问,也就是说子 shell 里的变量不能被父 shell 所存取,实际上它们是局部变量。这里可以参考:Link (( ))和 [[ ]]Link shell 与 命令的执行 这两篇文章。

    下面用一段代码进行测试:

    #!/bin/bash
    
    echo "Subshell level = $BASH_SUBSHELL"
    
    outer_variable=Outer
    outer_variable2=Outer2
    
    (
     echo "Subshell level INSIDE subshell = $BASH_SUBSHELL"
     inner_variable=Inner
     outer_variable2=Outer_var_changein_subshell
     echo "From Subshell,\"inner_variable\"=$inner_variable"
     echo "From parent shell,\"outer\"=$outer_variable"
     echo "From parent shell, \"outer\"=$outer_variable2"
    )
    
    echo "In parent shell, check \"outer_variable\" value:$outer_variable"
    echo "In parent shell, check \"outer_variable2\" value:$outer_variable2"
    
    echo
    echo "Subshell level OUTSIDE subshell = $BASH_SUBSHELL"
    echo
    
    if [ -z "$inner_variable" ]
    then
        echo "inner_variable undefined in main body of shell"
    else
        echo "From main body of shell,\"inner_variable\"=$inner_variable"
    fi
    
    exit 0
    

    运行输出:

    beyes@debian:~/shell$ ./subshell.sh
    Subshell level = 0
    Subshell level INSIDE subshell = 1
    From Subshell,"inner_variable"=Inner
    From parent shell,"outer"=Outer
    From parent shell, "outer"=Outer_var_changein_subshell
    In parent shell, check "outer_variable" value:Outer
    In parent shell, check "outer_variable2" value:Outer2
    Subshell level OUTSIDE subshell = 0
    inner_variable undefined in main body of shell
    

    在上面的代码中,BASH_SUBSHELL 是一个环境变量,它表示进入子 shell 的层级,比如处于当前 shell 时,该变量值为 0;当在当前 shell 派生的子 shell 里时,该变量值为 1;如果该子 shell 又派生出一个子 shell,那么该变量在此间的值就为 3,以此类推。

    在代码中,( ) 里的代码段是在子 shell 里执行的,而 inner_variable 作为局部变量,它的值可以在 ( ) 这段代码里 echo 出来,但是一旦返回到父shell 时,它就是未定义的,所以会输出“ inner_variable undefined in main body of shell”。也就是说,局部变量不能被外部代码所访问。

    从输出可以看到,在子 shell 中和父 shell 中变量 outer_variable 的输出值是一样的;相对应的 outer_variable2 变量即使在子 shell 中进行了修改,但是当返回到父 shell 对其输出时,它却还是父 shell 中原来所赋的值。从这里可以看出,子 shell 可以 “感知” 父 shell 中的变量,但它不能修改它。其本质的原因和 fork() 函数的原理有关。在 UNIX/LINUX 中,fork 出来的子进程实际上是对父进程的一种拷贝,而子 shell 就是父shell fork 出来的一个子进程,所以它理所当然的有了父shell 中的一片拷贝。所以,子 shell 里的 outer_variable 和 outer_variable2 变量虽然和父 shell 的同名,但它们并不是同一个变量,而是父 shell 里的一个副本。

    说到父shell 和 子 shell,那么会想到 export 这个命令。export 也是 bash 的一个内置命令。它主要是用来将父 shell 里的变量导出供子 shell 使用。它有如下特征:1. 用 export 导出的变量放在“导出变量列表”中,它可以被子 shell (子 shell 的子 shell 也是如此)拷贝并使用。2. 被 export 出来的变量虽然可以被子 shell 使用,但它也只是一个拷贝,而不会影响到父 shell 中的值以及其它子 shell 中的值。

    看下面示例;

    1. 先在当前 shell 里 export 一个变量:

      beyes@debian:~/shell$ export exp8temp="hello world"
      beyes@debian:~/shell$ echo $exp8temp
      hello world
      
    2. 运行一个脚本 echo 此变量(该脚本只有一句话即 echo $exp8temp ):

      $ ./exp8.sh
      hello world
      

    由上可见,父 shell 里 export 的变量可以被子 shell 读取。

    1. 测试一下子 shell 更改此变量是否会影响父 shell 里的值,子 shell 代码如下:

      #!/bin/bash
      
      exp8temp="hello shell"
      
      echo $exp8temp
      

    检验上面的情景:

    beyes@debian:~/shell$ ./exp8.sh
    hello shell
    beyes@debian:~/shell$ echo $exp8temp
    hello world
    

    可见子 shell 对父 shell 里 export 出来的变量进行修改并不能影响到父 shell。这说明了,子 shell 只是在“导出变量列表“里对该变量进行了一个拷贝。但反过来,父shell再次更改此变量时,子 shell 再去读时,读到的是新值,而不是原来的值。

    4. 如果在子 shell 里 export 出的变量,父 shell 是否能读到呢?先将下面一段代码放在后台运行:

    #!/bin/bash
    
    export exp9temp="hello world"
    
    sleep 30
    
    exit 0
    

    然后在在 30 秒内在父 shell 里读取一下 $exp9temp 的值,发现输出为空。所以我们得出结论,export 出来的变量不能导出到父进程或者是父进程的环境里。一个自己称可以继承父进程的东西,而不能反过来去影响父进程。

    那么子 shell 有什么办法可以向父 shell 传递自己的变量吗?下面方法可以考虑:

    1. 通过一个中间文件进行:

      #!/bin/bash
      
      (
       subvar="hello shell"
       echo "$subvar" > temp.txt
      )
      
      read pvar < temp.txt
      
      echo $pvar
      
      运行输出:
      $ sh subandp.sh
      hello shell
      
    2. 通过命令替换:

      #!/bin/bash
      
      pvar=`subvar="hello shell";echo $subvar`
      
      echo $pvar
      
    运行输出: ::
    $ ./subandp.shhello shell

    执行命令替换符(两个反单引号)之间的命令也是在子 shell 来完成的。

    1. 使用命名管道:

      #!/bin/bash
      
      mkfifo -m 777 npipe
      
      (
        subsend="hello world"
        echo "$subsend" > npipe &
       )
      
      read pread < npipe
      
      echo "$pread"
      
      exit 0
      

    运行输出:

    beyes@debian:~/shell$ ./var.sh
    hello world
    

    关于有名管道创建命令 mkfifo 可参考:http://www.groad.net/bbs/read.php?tid-3707.html

    1. 使用 here 文档:

      #!/bin/bash
      
      read pvar << HERE
      `subvar="hello shell"
      echo $subvar`
      HERE
      
      echo $pvar
      

    运行输出:

    $ ./subandp.sh
    hello shell
    

    方法应该还有很多,这些方法的本质原理基于进程间的通信。


    转载自:

    父 shell,子 shell ,export 与 变量传递


    展开全文
  • Linux Shellecho,变量

    万次阅读 2017-03-31 17:59:59
    Linux Shellecho,变量   本文通过一些简单的demo来学习两种 Linux Shell 在终端echo打印信息的方式并简单介绍了shell变量的概念。 由于目前本人学识有限,可能理解和总结并不全面,如有错误或不足,敬请...

    Linux Shell之echo,变量

     

    本文通过一些简单的demo来学习两种 Linux Shell 在终端echo打印信息的方式并简单介绍了shell变量的概念。

    由于目前本人学识有限,可能理解和总结并不全面,如有错误或不足,敬请指正补充,不吝赐教。

     

    echo

     输出转义字符

     

    闲来无事,用shell写了个打印九九乘法口诀0.0,所以就以此小例子来学习,

    顺便学习一点shell的简单例子。

    可以清楚看出述输出结果中,因为乘法表从5*2=10因为进十位多占一个字符,导致下面层与前面几层没有实现对齐,然而这对于强迫症患者来说可能是受不了的哈哈,那么问题来了如何使之对齐呢,高级语言中有转义字符来解决这个问题,而shell中也能使用转义字符。所以可以运用转义字符“\t”使之对齐,试了好多遍发现并没什么用,后来才发现与高级语言还是有略微不同,在shell 中echo语句 不可直接识别转义字符。

    具体解决办法如下图。


     

     

    对没错就是这样

     

    完美解决。

     

    Note:

    1)#!/bin/bash   这个是告诉系统 解释此脚本文件的Shell程序

    # 这个是注释行,当行有效

    脚本程序一般用 xx.sh 文件表示,这样一样就可以看出文件的属性,当然也可以不这样

    一个脚本程序写完后,如果要执行它,则必须先赋+x  执行权限给它

    例如:chmod +x xx.sh,然后用命令 ./filename  执行

    另外一种方式是直接运行解释器,其参数就是shell脚本的文件名,如:

    /bin/sh test.sh

    /bin/php test.php

    这种方式运行的脚本,不需要在第一行指定解释器信息,写了也没用。

    2let :用来执行算数运算和数值表达式测试。

    3)read:用于获取用户输入的字符

    4)dodone: 则代表高级语言里的左右大括号即{}


     

     

    另外还有许多同学都对echo后面的几种括号区分了解得不是很清晰。

    下面顺便扩展一下echo后面的输出方式的知识。


    echo 共有 4 种输出方式:

    1.        直接在 echo 后面跟要输出的信息:


    note
    1
    )shell 是一种解析语言,即不需要编译而直接按行读取并解析执行的程序语言。
    2)shell 以分号 “ ;” 为指令执行的终止分隔符,因此在执行代码的第二行我们看到了 “;”后面的信息 “Nice to meet you" 被解析成下一条要执行的指令,

    并且报错 “Nice :command not found”

    3)shell里面引用变量时使用 "$" 符号,由于HOME 是系统环境变量,因此 $HOME 被解析输出成它的值。
    4)echo 默认每次从新的一行输出信息。

     

    2.        echo  后面使用双引号输出信息:


    note
    1)
    因为在第2行内无其他像 $, '', `和\以之类的特殊字符字符,””内的内容都被输出了,

    2)但如果双引号呢有$, '', `和\以之类的字符,则不被解释成字符本身

    可以看到在双引号中,$被作为特殊字符处理,HOME被解释为变量。

     

     

    3.        echo 后面使用单引号输出信息:


    echo 使用单引号输出信息时,变量是不会被展开的,即把变量符号直接当成字符串输出,而不是把变量符号展开表示成它的值输出。即单引号中所有的字符包括特殊字符($,'',`和\)都将解释成字符本身而成为普通字符。

     

     

    4.         echo 后面使用反引号输出信息:


    note:在反引号中的字符串将解释成shell命令来执行。所以第2行内字符串无法被识别导致报错,而第3行为正确shell命令,date被正确输出。

     

    echo总结:

    Linux Shell中有三种引号,分别为双引号("")、单引号('')以及反引号(` `)。

    其中双引号对字符串中出现的$、''、`和\进行替换;单引号不进行替换,将字符串中所有字符作为普通字符输出,而反引号中字符串作为shell命令执行,并返回执行结果。

    简单来说具体含义如下:

    双引号(""):在双引号中,除了$,'', `和\以外所有的字符都解释成字符本身。

    单引号(' '):在单引号中所有的字符包括特殊字符($,'',`和\)都将解释成字符本身而成为普通字符。

    反引号(` `):在反引号中的字符串将解释成shell命令来执行。

     

    Shell中的变量种类:局部变量和全局变量

        局部变量是在函数中用local 声明的变量:他的作用域是在函数调用开始到函数结束。

        全局变量 在shell脚本下声明的变量,他的作用域是整个shell的生存周期内。shell结束,全局变量的周期也结束。

    echo "在函数外调用 局部变量 var2="$var2

    echo "调用全局变量2  var1="$var1

    补充:环境变量、位置变量、标准变量、特殊变量等

        环境变量:用于所有的用户进程,可以看成是windows下的环境变量,用export定义:

    Example:export YourName="YXW",

    可以用env或export查看系统环境变量并可以用unset释放变量

    unset variable_name。

    位置变量:就是调用函数时候的参数.

    标准变量:就是bash环境建立的一些标准环境的标量,他会自动去解析,基本都在/etc/profile中定义了有EXINIT,HOME,IFS,LOGNAME,MAIL,MAILCHECK等(引用网上资料)

        特殊变量:$# 参数个数,$* 列出所有参数,$!显示后天脚本的进程Id ,$$显示当成脚本的进程id,$? 最后命令退出的状态,0 表示正常;


     

    展开全文
  • 多个 echo 输出 不换行

    万次阅读 2015-08-25 08:43:33
    shell中,echo输出会自动换行。有时候在循环中希望echo输出不换行。代码实现如下:  echo -e " \c"   -e 表示开启转义  \c表示不换行  


                 在shell中,echo输出会自动换行。有时候在循环中希望echo输出不换行。代码实现如下:

                             echo -e     " \c"  

                                         -e 表示开启转义

                                          \c表示不换行

                       脚本:

                           while ((i=0;i<10))

                                 do

                                        echo -e "ae\c"

                                          let i+=1

                                 done

                              exit 0

                输出如下:

                                  aeaeaeaeaeaeaeaeaeae

    展开全文
  • 文章目录1.shell简介1)什么是shell2)shell脚本3)运行shell脚本4)shell注释5)shell编写的基本步骤2.shell变量1)命名变量2)使用变量3)变量类型3)变量操作3.shell字符串1)字符串类型2)字符串操作4.shell数组...

    1.shell简介

    1.1 什么是shell

    什么是shell呢?shell是用C语言编写的程序,它是用户使用 Linux 的桥梁。Shell既是一种命令语言,又是一种程序设计语言。简单来说Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。也可以这样认为,linux中的shell就是linux内核的一个外层保护工具,并负责完成用户与内核之间的交互

    1.2 shell脚本

    shell脚本就是一种专门使用shell编写的脚本程序,它虽然没有C++、Java、Python等一系列高级语言功能强大,但是在服务器运维领域以及嵌入式开发领域,shell脚本具有举足轻重的地位。

    shell脚本编程如同其他编程语言的一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以运行了,而linux下的shell种类众多,常用的用:

    • Bourne Shell(/usr/bin/sh或/bin/sh)
    • Bourne Again Shell(/bin/bash)
    • C Shell(/usr/bin/csh)
    • K Shell(/usr/bin/ksh)
    • Shell for Root(/sbin/sh)
    • … …

    在诸多linux发行版系统中,最常用的就是Bash,就是Bourne Again Shell,因为其能工提供环境变量以配置用户shell环境,支持历史记录、内置算数功能、支持通配符表达式等高效性能,将linux常用命令进行的简化,被广泛应用于Debian系列的linux发行版中。

    1.3 运行shell脚本

    运行shell脚本的方法有两种:

    • 作为可执行程序运行
    • 作为解释器参数运行

    shell脚本编写如下,并将其保存为test.sh,进入存放此文件目录

    #!/bin/bash
    echo "Hello World"
    
    • 当作为可执行程序运行时候

    • chmod +x test.sh	# 赋予可执行权限
      ./test.sh		    # 执行程序
      

    在这里插入图片描述

    • 当作为解释器参数运行时

    • /bin/sh test.sh		# 执行命令
      /bin/php test.php	# 执行命令
      

    在这里插入图片描述

    1.4 shell注释

    • 单行注释:和python注释相同,以#号开头作为单行注释

    • # 这是一个注释
      # author:ohuohuoo
      # date:`date`
      
    • 多行注释:如果在开发过程中,,遇到大段的代码需要临时注释起来,过一会儿又取消注释,可以将其定义为一个花括号的注释函数,也可以用多行注释

    • :<<EOF
      注释内容...
      注释内容...
      注释内容...
      EOF
      
      # EOF可以换成其他符号
      :<<E!
      注释内容...
      注释内容...
      注释内容...
      !
      

    1.5 shell编写的基本步骤

    • 建立shell文件
    • 赋予shell文件可执行程序权限(使用chmod命令修改权限)
    • 执行shell文件(直接运行赋予权限后的二进制文件)

    2.shell变量

    2.1 命名变量

    shell编程中,定义变量是直接定义的,没有明确的数据类型,shel允许用户建立变量存储数据,但是将认为赋给变量的值都解释为一串字符,如下

    cout=1			# 定义变量		
    name="ohuohuo"	 # 定义变量
    echo $cout		 # 取变量值
    echo $name	     # 取变量值
    

    shell中,英文符号"$"用于取变量值

    在这里插入图片描述

    注意点:shell编程的变量名的命名和其他语言一样,需要遵循一定的规则,规则如下

    • 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头
    • 中间不能有空格,可以使用下划线(_)
    • 不能使用标点符号
    • 不能使用bash里的关键字(可用help命令查看保留关键字)

    如下所示

    • 有效的命令

    • NAME
      LIBRARY_PATH
      _var
      var2
      
    • 无效的命名

    • ?var=123
      user*name=ohuohuo
      

    如果在变量中使用系统命令,需要加上 " `"符号(ESC键下方),如下所示

    • DATE1=`date`	
      DATE2=$(date)
      

      两者功能相同

    在这里插入图片描述

    2.2 使用变量

    使用变量的时,用英文符号"$"取变量值,对于较长的变量名,建议加上{ }花括号,帮助解释器识别变量的边界,如下

    name="test_name"
    echo "My name is ${name}and you"
    

    加上方括号时即所有便后面的语句不留空格,shell也会自动识别边界,默认添加一个空格

    在这里插入图片描述

    此外,已经定义过的变量,可以二次定义并重新被赋值覆盖上一次的变量值,这点如同其他语言

    在这里插入图片描述

    2.3 变量类型

    shell编程中也同样存在变量类型,在运行shell时会同时存在三种变量

    • 局部变量:在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量
    • 环境变量:所有的程序,包括shell启动的程序,都能访问环境变量,必要的时候shell脚本也可以定义环境变量
    • shell变量:由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,不同类型的变量保证了shell的正常运行

    2.4 变量操作

    shell中的变量,默认为可读可写类型,如果想要其只可读,如同url一样,需要将其声明为**只读类型变量(**如同const),使用readonly命令,如下脚本

    #!/bin/bash
    Url="http://www.baidu.com"
    readonly Url
    Url="http://www.csnd.net"
    

    这样的话,这句就会报错,提示/bin/sh: NAME: This variable is read only.此变量为只读变量

    在这里插入图片描述

    如果想要删除变量,使用unset命令解除命令赋值,但是unset不能删除可读变量,如下所示

    #!/bin/sh
    name="ohuohuo"
    Url="http://www.baidu.com"
    readonly Url	# 设置可读变量
    unset name		# 可以被删除
    unset Url		# 不可被删除
    echo $name		# 不被打印出
    echo $Url		# 打印出
    

    在这里插入图片描述

    3.shell字符串

    3.1 字符串类型

    在shell中字符串是shell编程中最常用最有用的数据类型,字符串可以用单引号,也可以用双引号,也可以不用引号。

    使用单引号

    str='this is a string'
    

    在这里插入图片描述

    使用单引号的不足:

    • 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的
    • 单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。

    使用双引号

    name="ohouhuoo"
    str="please input your \"$name"\"
    echo -e $str
    

    输出结果如下图

    在这里插入图片描述

    使用双引号的优势:

    • 可以在双引号中使用变量
    • 可以在双引号中使用转移字符

    由此可见,双引号较单引号而言有更强大的优势

    3.2 字符串操作

    • 获取字符串长度:在对变量进行取值时,使用" # "符号对字符串进行取值

    • string="abcd"
      echo ${#string} # 输出 4
      

    在这里插入图片描述

    • 提取子字符串:使用字符串的截取命令,用于提取部分字符串

    • string="this is a test"
      echo ${string:2:6} # 表示从第3个字符开始截取
      

      上式输出结果为is is,如下图

    在这里插入图片描述

    • 查找字符串:用于查找字符的位置,输出结果为字符在字符串中所占的数据位置,如果查找多个字符,那哪个字母先出现就计算哪个,如下查找itit两个字符,t先出现,输出为1

    • string="this is a test"
      echo `expr index "$string" it`  # 输出 1
      

    在这里插入图片描述

    4.shell数组

    在bash下,仅仅支持一维数组,并且没有限定数组的大小,不支持多维数组。类似于 C 语言,数组元素的下标由 0 开始编号(上述字符串也是这样)。获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于 0。

    4.1 定义数组

    在 Shell 中,用括号()来定义表示数组,数组中元素用"空格"符号分割开。定义数组的一般形式为:

    # 一般定义
    array_name=(value1 value2 value3 value4)
    
    # 多级定义
    array_test=(
    value1 
    value2 
    value3 
    value4
    )
    
    # 
    array_text[0]=value0
    array_text[1]=value1
    array_text[3]=value3
    ... 
    ...
    
    
    

    三种定义形式均可

    4.2 数组操作

    • 读取数组:和读取变量名相同,使用$符号,需要加上下标名

    • valuen=${array_name[n]}
      echo ${array_name[@]} # 读取所有
      
    • 获取数组长度:获取数组长度的方法与获取字符串长度的方法相同,如所示

    • # 取得数组元素的个数
      length=${#array_name[@]}	# 从头到尾取
      # 或者
      length=${#array_name[*]}	# 取所有
      # 取得数组单个元素的长度
      lengthn=${#array_name[n]}	# 取特定
      

    5.shell传递参数

    在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$nn 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推……,脚本编写如下,保存为test.sh

    echo "传递参数实例!";
    echo "执行的文件名:$0";
    echo "第一个参数为:$1";
    echo "第二个参数为:$2";
    echo "第三个参数为:$3";
    

    执行脚本如下

    chmod +x test.sh
    ./test.sh 1 2 3
    

    输出结果如下图,传递参数的过程在赋予权限执行脚本的过程中就已经完成

    在这里插入图片描述

    在使用shell传递参数的时候,常常需要用到以下的几个字符来处理参数

    参数处理 说明
    $# 传递到脚本的参数个数
    $* 以一个单字符串显示所有向脚本传递的参数。 如"$*“用「”」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。
    $$ 脚本运行的当前进程ID号
    $! 后台运行的最后一个进程的ID号
    $@ 使"*相同,但是使用时加引号,并在引号中返回每个参数。 如"@“用「”」括起来的情况、以"$1" “2""2" … "n” 的形式输出所有参数。
    $- 显示Shell使用的当前选项,与set命令功能相同。
    $? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

    举例如下

    echo "传递参数实例!";
    echo "第一个参数为:$1";
    
    echo "参数个数为:$#";
    echo "传递的参数作为一个字符串显示:$*";
    

    结果如图

    在这里插入图片描述

    6.shell运算符

    6.1 shell运算符种类

    与其他编程语言相同的是,shell同样支持多种运算符:

    • 算数运算符

    • 关系运算符

    • 布尔运算符

    • 逻辑运算符

    • 字符串运算符

    • 文件测试运算符

    shell想要使用这些运算符,需要结合其他命令和工具来使用(因为shell中不支持简单的数学运算),如使用算符运算符就需要搭配的常用的工具有两种

    • awk
    • expr(使用频繁)

    运算规则注意点

    • 表达式和运算符之间必须要有空格,例如 3+2 是不对的,必须写成 3 + 2
    • 完整的表达式要被 两个" ` "包含(在 Esc 键下边那个键)

    如下实例

    #!/bin/bash
    
    val=`expr 3 + 2`
    echo "两数之和为 : $val"
    

    执行脚本后,输出结果为

    两数之和为 : 5
    

    在这里插入图片描述

    6.2 算数运算符

    shell支持的常用的如下表,举例中这里假定变量 a 为 10,变量 b 为 20,

    运算符 说明 举例
    + 加法 expr $a + $b 结果为 30。
    - 减法 expr $a - $b 结果为 -10。
    * 乘法 expr $a \* $b 结果为 200。
    / 除法 expr $b / $a 结果为 2。
    % 取余 expr $b % $a 结果为 0。
    = 赋值 a=$b 将把变量 b 的值赋给 a。
    == 相等。用于比较两个数字,相同则返回 true。 [ $a == $b ] 返回 false。
    != 不相等。用于比较两个数字,不相同则返回 true。 [ $a != $b ] 返回 true。

    需要注意的点:

    • 在windows系统中乘号(*)前边必须加反斜杠()才能实现乘法运算;

    6.3 关系运算符

    shell中的关系运算符和其他编程语言不同,shell中使用特殊的字符表示关系运算符,并且只支持数字,不支持字符串,除非字符串是数字,下表为常用关系运算符,同样指定a为10,b为20

    运算符 说明 举例
    -eq 检测两个数是否相等,相等返回 true。 [ $a -eq $b ] 返回 false。
    -ne 检测两个数是否不相等,不相等返回 true。 [ $a -ne $b ] 返回 true。
    -gt 检测左边的数是否大于右边的,如果是,则返回 true。 [ $a -gt $b ] 返回 false。
    -lt 检测左边的数是否小于右边的,如果是,则返回 true。 [ $a -lt $b ] 返回 true。
    -ge 检测左边的数是否大于等于右边的,如果是,则返回 true。 [ $a -ge $b ] 返回 false。
    -le 检测左边的数是否小于等于右边的,如果是,则返回 true。 [ $a -le $b ] 返回 true。

    脚本编写如下

    #!/bin/bash
    
    a=10
    b=20
    
    if [ $a -eq $b ]
    then
       echo "$a -eq $b : a 等于 b"
    else
       echo "$a -eq $b: a 不等于 b"
    fi
    if [ $a -ne $b ]
    then
       echo "$a -ne $b: a 不等于 b"
    else
       echo "$a -ne $b : a 等于 b"
    fi 
    

    将脚本执行结果如下

    10 -eq 20: a 不等于 b
    10 -ne 20: a 不等于 b
    

    在这里插入图片描述

    需要注意的点:

    • 运算符和数之间必须要用空格隔开

    6.4 布尔运算符

    shell中的布尔运算符使用如下表,同样指定a为10,b为20

    运算符 说明 举例
    ! 非运算,表达式为 true 则返回 false,否则返回 true。 [ ! false ] 返回 true。
    -o 或运算,有一个表达式为 true 则返回 true。 [ $a -lt 20 -o $b -gt 100 ] 返回 true。
    -a 与运算,两个表达式都为 true 才返回 true。 [ $a -lt 20 -a $b -gt 100 ] 返回 false。

    脚本编写如下

    #!/bin/bash
    
    a=10
    b=20
    
    if [ $a != $b ]
    then
       echo "$a != $b : a 不等于 b"
    else
       echo "$a == $b: a 等于 b"
    fi 
    

    执行脚本,结果如下

    10 != 20 : a 不等于 b
    

    在这里插入图片描述

    6.5 逻辑运算符

    shell中的逻辑运算符和其他编程语言有类似的地方,如下表。假定变量 a 为 10,变量 b 为 20

    运算符 说明 举例
    && 逻辑的 AND [[ $a -lt 100 && $b -gt 100 ]] 返回 false
    || 逻辑的 OR [[ $a -lt 100 || $b -gt 100 ]] 返回 true

    编写脚本如下

    #!/bin/bash
    
    a=10
    b=20
    
    if [[ $a -lt 100 && $b -gt 100 ]]
    then
       echo "返回 true"
    else
       echo "返回 false"
    fi 
    

    执行脚本,结果如下

    返回 false
    

    在这里插入图片描述

    需要注意的点:

    • 这里使用两层的[ ]符号,将两次关系运算的结果保存在条件句中

    6.6 字符串运算符

    shell中常用的字符串运算符如下表。假定变量 a 为 “abc”,变量 b 为 “efg”

    运算符 说明 举例
    = 检测两个字符串是否相等,相等返回 true。 [ $a = $b ] 返回 false。
    != 检测两个字符串是否相等,不相等返回 true。 [ $a != $b ] 返回 true。
    -z 检测字符串长度是否为0,为0返回 true。 [ -z $a ] 返回 false。
    -n 检测字符串长度是否不为 0,不为 0 返回 true。 [ -n “$a” ] 返回 true。
    $ 检测字符串是否为空,不为空返回 true。 [ $a ] 返回 true。

    编写脚本如下

    #!/bin/bash
    
    a="abc"
    b="efg"
    
    if [ $a != $b ]
    then
       echo "$a != $b : a 等于 b"
    else
       echo "$a != $b: a 不等于 b"
    fi 
    

    执行脚本,结果输出如下

    abc != efg : a 不等于 b
    

    在这里插入图片描述

    6.7 文件测试运算符

    shell中的文件测试运算符用于检测在类unix系统中,文件的各种属性,如下表

    操作符 说明 举例
    -b file 检测文件是否是块设备文件,如果是,则返回 true。 [ -b $file ] 返回 false。
    -c file 检测文件是否是字符设备文件,如果是,则返回 true。 [ -c $file ] 返回 false。
    -d file 检测文件是否是目录,如果是,则返回 true。 [ -d $file ] 返回 false。
    -f file 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 [ -f $file ] 返回 true。
    -g file 检测文件是否设置了 SGID 位,如果是,则返回 true。 [ -g $file ] 返回 false。
    -k file 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 [ -k $file ] 返回 false。
    -p file 检测文件是否是有名管道,如果是,则返回 true。 [ -p $file ] 返回 false。
    -u file 检测文件是否设置了 SUID 位,如果是,则返回 true。 [ -u $file ] 返回 false。
    -r file 检测文件是否可读,如果是,则返回 true。 [ -r $file ] 返回 true。
    -w file 检测文件是否可写,如果是,则返回 true。 [ -w $file ] 返回 true。
    -x file 检测文件是否可执行,如果是,则返回 true。 [ -x $file ] 返回 true。
    -s file 检测文件是否为空(文件大小是否大于0),不为空返回 true。 [ -s $file ] 返回 true。
    -e file 检测文件(包括目录)是否存在,如果是,则返回 true。 [ -e $file ] 返回 true。

    编写脚本如下

    #!/bin/bash
    
    file="/var/www/test/test.sh"
    if [ -r $file ]
    then
       echo "文件可读"
    else
       echo "文件不可读"
    fi    
    

    执行脚本,结果输出如下

    文件可读
    

    7.shell编程中的命令

    7.1 echo命令

    echo命令在shell中用于字符串的输出,调用的格式:

    echo string
    

    echo命令还可显示复杂的输出格式

    • 显示普通的字符串

      • echo "this is a test"
        
    • 显示转义字符

      • echo "\this is a test\"
        
    • 显示变量

      • name="ohuohuo"
        echo "you name is $name"
        
    • 显示换行

      • echo -e "Right!\n " # -e 表示开启转义
        echo "this is other line"
        
    • 显示结果定向重定向至文件

      • echo "this is a test" > testfile
        
    • 显示command命令执行结果

      • echo `date`
        

    echo命令还有其他使用规则,经常使用就可熟练掌握

    7.2 printf命令

    shell中的printf命令如同C语言中一样,调用格式也大抵相同,只是有一点点不同。与echo命令打印字符串不同的是,printf不会自动调价换行符号,可以手动添加

    printf命令的语法:

    printf format-string [arguments...]
    

    参数说明:

    • format-string:格式控制字符串
    • arguments:参数列表

    举例如下

    $ echo "Hello, Shell"	# 输入
    Hello, Shell		   # 输出
    $ printf "Hello, Shell\n" # 输入
    Hello, Shell			# 输出
    

    printf命令可以较为强大的使用转义字符,shell中常用的转义字符如下表示所示

    序列 说明
    \a 警告字符,通常为ASCII的BEL字符
    \b 后退
    \c 抑制(不显示)输出结果中任何结尾的换行字符(只在%b格式指示符控制下的参数字符串中有效),而且,任何留在参数里的字符、任何接下来的参数以及任何留在格式字符串中的字符,都被忽略
    \f 换页(formfeed)
    \n 换行
    \r 回车(Carriage return)
    \t 水平制表符
    \v 垂直制表符
    \ 一个字面上的反斜杠字符
    \ddd 表示1到3位数八进制值的字符。仅在格式字符串中有效
    \0ddd 表示1到3位的八进制值字符

    7.3 test命令

    shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试

    数值测试命令表

    参数 说明
    -eq 等于则为真
    -ne 不等于则为真
    -gt 大于则为真
    -ge 大于等于则为真
    -lt 小于则为真
    -le 小于等于则为真

    应用举例如下

    #!/bin/bash
    num1=100
    num2=100
    if test $[num1] -eq $[num2]
    then
        echo '两个数相等!'
    else
        echo '两个数不相等!'
    fi
    

    输出结果

    两个字符串不相等!
    

    字符串测试表

    参数 说明
    = 等于则为真
    != 不相等则为真
    -z 字符串 字符串的长度为零则为真
    -n 字符串 字符串的长度不为零则为真

    脚本实例如下

    # !/bin/bas
    num1="name"
    num2="function"
    if test $num1 = $num2
    then
        echo '两个字符串相等!'
    else
        echo '两个字符串不相等!'
    fi
    

    输出结果

    两个字符串不相等!
    

    文件测试表

    参数 说明
    -e 文件名 如果文件存在则为真
    -r 文件名 如果文件存在且可读则为真
    -w 文件名 如果文件存在且可写则为真
    -x 文件名 如果文件存在且可执行则为真
    -s 文件名 如果文件存在且至少有一个字符则为真
    -d 文件名 如果文件存在且为目录则为真
    -f 文件名 如果文件存在且为普通文件则为真
    -c 文件名 如果文件存在且为字符型特殊文件则为真
    -b 文件名 如果文件存在且为块特殊文件则为真

    脚本编写如下

    # !/bin/bash
    if test -e ./bash
    then
        echo '文件已存在!'
    else
        echo '文件不存在!'
    fi
    

    输出结果如下

    文件已存在!
    

    8.shell流程控制

    shell作为一种脚本语言,也有着自己的流程控制,而shell中的流程控制主要由条件、循环组成

    8.1 if else条件

    shell中的if else条件具有一定的模版。其调用格式为:

    • if - then - fi:

    调用格式如下

    if condition
    then
        command1 
        command2
        ...
        commandN 
    fi
    
    # 写成单行
    if condition;then command1; command2;fi
    

    如果存在不满足的条件的情况

    if condition
    then
        command1 
        command2
        ...
        commandN
    else
        command
    fi
    

    在多层嵌套条件情况

    if condition1
    then
        command1
    elif condition2 
    then 
        command2
    else
        commandN
    fi
    

    应用举例

    num1=$[6]
    num2=$[8]
    if test $[num1] -eq $[num2]
    then
        echo '两个数字相等!'
    else
        echo '两个数字不相等!'
    fi
    

    执行脚本,结果输出如下

    两个数字相等!
    

    8.2 case条件

    shell中case语句为多功能选择语句,与其他语言相通的是,可以用case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。case语句调用格式如下:

    casein
    模式1)
        command1
        command2
        ...
        commandN
        ;;
    模式2)
        command1
        command2
        ...
        commandN
        ;;
    esac
    

    需要注意的点:

    • 取值后面需要加上in
    • 每一模式必须以右括号结束
    • 每个模式结束后使用;;符号结尾
    • 如果没有找到对应的模式。以*结尾,并跳出case
    • case需要搭配esac结尾,与C语言中的switch … case语句类似

    脚本举例如下

    echo '输入 1 到 4 之间的数字:'
    echo '你输入的数字为:'
    read num
    case $num in
        1)  echo '你选择了 1'
        ;;
        2)  echo '你选择了 2'
        ;;
        3)  echo '你选择了 3'
        ;;
        4)  echo '你选择了 4'
        ;;
        *)  echo '你没有输入 1 到 4 之间的数字'
        ;;
    esac
    

    执行脚本,运行如下

    输入 1 到 5 之间的数字:4
    你输入的数字为 4!
    输入 1 到 5 之间的数字:8
    你输入的数字不是 1 到 5 之间的! 游戏结束
    

    case中想要跳出循环有两个命令:break和continu

    • break命令:允许跳出所有循环(中止执行后面所有的循环)

      • 使用举例

      • #!/bin/bash
        while :
        do
            echo -n "输入 1 到 5 之间的数字:"
            read num
            case $num in
                1|2|3|4|5) echo "你输入的数字为 $num!"
                ;;
                *) echo "你输入的数字不是 1 到 5 之间的! 游戏结束"
                    break
                ;;
            esac
        done
        
      • 执行输出如下

      • 输入 1 到 5 之间的数字:3
        你输入的数字为 3!
        输入 1 到 5 之间的数字:7
        你输入的数字不是 1 到 5 之间的! 游戏结束
        
    • contimue:shell中的continue命令与break命令类似,只有一点差别,它不会跳出所有循环,仅仅跳出当前循环。这一点和其他类型的语言相同

    • 应用举例,同样的将上式修改如下

    • #!/bin/bash
      while :
      do
          echo -n "输入 1 到 5 之间的数字: "
          read num
          case $num in
              1|2|3|4|5) echo "你输入的数字为 $num!"
              ;;
              *) echo "你输入的数字不是 1 到 5 之间的!"
                  continue
                  echo "游戏结束"
              ;;
          esac
      done
      
    • 执行脚本,结果输出如下
      在这里插入图片描述

    8.3 for循环

    shell中的for循环调用格式和python中的for循环有点类似,也是有模板的:

    for var in item1 item2 ... itemN
    do
        command1
        command2
        ...
        commandN
    done
    
    # 写成一行同样使用分号将语句分开 
    

    需要注意的是:

    • in列表中可以包含替换、字符串和文件名等
    • in列表是可选的,如果默认不适用,将会循环使用命令行中的位置参数

    应用脚本编写如下

    for num in 1 2 3 4 5
    do
        echo "The value is: $num"
    done
    

    输出结果如下

    The value is: 1
    The value is: 2
    The value is: 3
    The value is: 4
    The value is: 5
    

    在这里插入图片描述

    8.4 while循环

    shell中的while循环用于不断执行一系列命令,也用于从输入文件中读取数据,调用格式如下

    while condition
    do
        command
    done
    

    应用脚本编写如下:

    #!/bin/bash
    num=1
    while(( $num<=5 ))
    do
        echo $num
        let "num++"
    done
    

    执行脚本,结果运行如下

    1
    2
    3
    4
    5
    

    只需要知道shell中while循环的格式,同样可以做到和C语言中一样, 使用while循环进行判定或者判断键盘循环,甚至无限循环等,如下使用while循环读取键盘操作

    echo '按下 <Q> 退出'
    echo -n '输入你最喜欢的歌名: '
    while read SONG
    do
        echo "啊!$SONG 真是一首好歌"
    done
    

    执行脚本,运行结果如下

    按下<Q>退出
    输入你最喜欢的歌名: Takeway
    啊!Takeway 真是一首好歌
    

    在这里插入图片描述

    8.5 until循环

    until 循环执行一系列命令直至条件为 true 时停止。until 循环与 while 循环在处理方式上刚好相反。一般 while 循环优于 until 循环,但在某些时候—也只是极少数情况下,until 循环更加有用。until循环调用格式:

    until condition
    do
        command
    done
    

    condition 一般为条件表达式,如果返回值为 false,则继续执行循环体内的语句,否则跳出循环,脚本编写如下

    #!/bin/bash
    
    a=0
    until [ ! $a -lt 5 ]
    do
       echo $a
       a=`expr $a + 1`
    done
    

    执行脚本,结果输出如下

    0
    1
    2
    3
    4
    5
    

    9.shell函数

    9.1 定义函数

    linux中的shell同样可以定义函数,然后在函数中调用执行相关的shell命令,完成功能,shell中的函数调用格式如下:

    [ function ] funname [()]
    {
        action;
        [return int;]
    }
    

    参数说明:

    • function fun () 表示有返回参数的函数(如同C语言中的有返回类型的函数(int,char等))
    • fun() 表示无返回参数的函数(类似于C语言中的void类型函数)
    • 使用return可以返回参数值(一般为数值n),如果不使用,将默认以最后一条命令运行的结果作为返回值

    脚本应用举例如下

    #!/bin/bash
    
    FunReturn(){
        echo "两个数字进行相加运算..."
        echo "输入第一个数字: "
        read num
        echo "输入第二个数字: "
        read anothernum
        echo "两个数字分别为 $num$anothernum !"
        return $(($num+$anothernum))	# 分别返回数值
    }
    FunReturn		# 调用函数
    echo "输入的两个数字之和为 $? !" # 使用通配符获取上一条指令的返回值
    

    执行脚本,运行如下

    两个数字进行相加运算...
    输入第一个数字: 
    1
    输入第二个数字: 
    2
    两个数字分别为 1 和 2 !
    输入的两个数字之和为 3 !
    

    在这里插入图片描述
    需要注意的是:

    • 所有的函数在使用前必须定义,这是因为shell解释器是顺序逐层执行的,当shell解释器发现定义的函数时,才会找到其对应的功能,进而执行。

    9.2 参数定义

    此外想要使用shell函数传递参数时,需要在函数体的内部,通过 $n 的形式来获取参数的值,与其他语言不同的是,这不是在定义函数的时候就给定参数,而是在函数体中获取到的参数,例如,$1表示第一个参数,$2表示第二个参数,参数调用列表如下

    参数处理 说明
    $# 传递到脚本或函数的参数个数
    $* 以一个单字符串显示所有向脚本传递的参数
    $$ 脚本运行的当前进程ID号
    $! 后台运行的最后一个进程的ID号
    $@ 与$*相同,但是使用时加引号,并在引号中返回每个参数。
    $- 显示Shell使用的当前选项,与set命令功能相同。
    $? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

    应用脚本举例:

    #!/bin/bash
    FunParam(){
        echo "输入第一个参数 $1 !"
        echo "输入第二个参数 $2 !"
        echo "输入第十个个参数 $10 !"
        echo "参数总数共 $# 个!"
        echo "作为一个字符串输出所有参数 $* !"
    }
    FunParam 1 2 3 4 5 6 7 8 9 10
    

    执行脚本如下

    第一个参数为 1 !
    第二个参数为 2 !
    第十个参数为 10 !
    参数总数有 10 个!
    作为一个字符串输出所有参数 1 2 3 4 5 6 7 8 9 10!
    

    在这里插入图片描述

    10.shell重定向

    • 在之前的学习笔记中,归纳了linux中重定向的使用,这里不再赘述
    • linux中的重定向

    11.结尾

    shell编程相较于其他编程语言而言较为简单,只要多敲多练,很快就能入手,但是不可忽视shell编程在嵌入式开发和网络开发中的强大作用,至此作为总结归纳,如诺有错误,欢迎指正。

    展开全文
  • //start.sh #!/bin/bash ./do10.sh >> log.log & ...echo $! > COSDNA.pid //stop.sh #!/bin/bash cat ./COSDNA.pid | xargs -IX kill -9 X ps -a| grep php | awk '{print $1}'|xargs -IX kill -9 X
  • Linux(4) Shell 编程入门

    万次阅读 2019-05-05 09:34:22
    Shell 编程入门 走进 Shell 编程的大门 为什么要学Shell? 学一个东西,我们大部分情况都是往实用性方向着想。从工作角度来讲,学习 Shell 是为了提高我们自己工作效率,提高产出,让我们在更少的时间完成更多的事情...
  • shell写守护进程

    千次阅读 2008-11-06 09:54:00
    设想:用一个shell查看一个后台运行PHP程序是否非正常退出 如果退出,利用守护进程自动restart.类似mysql的safe_mysqld共3个程序shstart.sh 负责启动sh.sh 守护进程主程序shstop.sh 安全退出守护进程和php程序主体...
  • shell一文入门通

    万次阅读 多人点赞 2019-11-13 22:14:51
    简单来说“Shell编程就是对一堆Linux命令的逻辑化处理”。 W3Cschool 上的一篇文章是这样介绍 Shell的 hello world 学习任何一门编程语言第一件事就是输出HelloWord了!下面我会从新建文件到shell代码编写来说下...
  • 我是handsomecui,下面我为大家讲解一下shell脚本的写法,讲的不好的地方,欢迎大家留言拍砖。希望同仁们,支持下鄙人的小窝 访问网站 1.在linux下会写shell脚本是非常重要的,下面我参照例子给大家展示几个脚本,...
  • PHP 命令行工具 shell_exec, exec, passthru

    千次阅读 2010-12-06 23:18:00
    PHP 命令行工具 shell_exec, exec, passthru
  • shell语法

    万次阅读 2014-05-03 09:50:51
    1. 数组 #定义数组 ...echo ${#array[*]} #遍历数组 for arr in ${array[*]}; do echo $arr done 2. 转换大小写# 使用typeset后必须重新赋值才起作用 typeset -u content #upper content="Show M
  • shell安装软件脚本

    千次阅读 2018-08-16 12:12:18
    echo &quot;2秒后安装apache服务,请稍后&quot; sleep 2 #安装apache yum -y install httpd httpd-devel #启动apache服务 systemctl start httpd #设置开机启动 systemctl enable httpd #查...
  • 如何在脚本中获取进程ID(PID)

    千次阅读 2015-11-16 10:13:09
    我想要知道运行中脚本子shell的进程id。我该如何在shell脚本中得到PID。   当我在执行shell脚本时,它会启动一个叫子shell的进程。作为主shell的子进程,子shellshell脚本中的命令作为批处理运行(因此称为...
  • 需求 : 我需要在启动 docker 容器的同时在容器中执行启动 Laravel 队列的脚本 php artisan queue:work ...echo 'start message queue' service apache2 start php /var/www/html/artisan queue:...
  • ubuntu的sh文件编程(一)

    万次阅读 2016-11-15 15:07:18
    打开文本编辑器,新建一个文件,扩展名为sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好,如果你用phpshell 脚本,扩展名就用php好了。 输入一些代码: #!/bin/bashecho "Hello World !" “#!” ...
  • shell编程

    千次阅读 2019-11-07 10:36:08
    什么是shell编程 高大上的解释,往往让人摸不住头脑。一句话概括就是:shell编程就是对一堆Linux命令的逻辑化处理。 为什么要会shell编程 就是批处理动作,解放双手,避免重复性劳动。 第一个...
  • docker exec -it master /bin/bash -c 'echo $PATH' docker exec -it master /bin/bash -c 'cd /home/bigdata/shell && ./test.sh' 如果shell脚本中涉及到环境变量,或者提示JAVA_HOME is not set,可以在...
  • shell脚本赋值的5种方法

    万次阅读 2012-02-21 12:44:31
    Shell中的环境变量是一类Shell预定义变量,是用于设置系统运行环境的变量,环境变量由系统统一命名。部分系统变量的值由系统设定,部分环境变量的值可以由用户给定。 环境变量的名称由大写字母组成,常用的Shell...
  • shell极简教程

    千次阅读 2017-10-11 01:29:16
    一,shell题记 不懂shell的程序员不是好程序员,学习shell是为了自动化,使用自动化可以非常有效的提高工作效率。没有一个大公司不要求linux的基本技能的,只是不同岗位要求掌握的程度不同。 二,shell简介 ...
  • 本人网上收集整理的shell教程,非常详细

    千次阅读 多人点赞 2016-09-10 22:24:51
    Shell简介:什么是ShellShell命令的两种执行方式 Shell本身是一个用C语言编写的程序,它是用户使用Unix/Linux的桥梁,用户的大部分工作都是通过Shell完成的。Shell既是一种命令语言,又是一种程序设计语言。作为...
1 2 3 4 5 ... 20
收藏数 23,188
精华内容 9,275
关键字:

php 的echo 运行shell