zoukankan      html  css  js  c++  java
  • Shell最多支持多少个参数

     
    这篇文章主要介绍了Shell最多支持多少个参数?本文是对Shell最多可以输入多少个参数的一篇测试文章,需要的朋友可以参考下
     

    在脚本编写过程中,通常会涉及到参数的输入。譬如,sh 1.sh 10 20,在执行1.sh这个脚本中,10即为第一个参数,20即为第二个参数。有时,就会有这个疑惑,即shell脚本最多可以支持多少个变量呢?疑惑之余,编写了如下脚本,可求出Shell脚本中可输入参数的最大个数。

    该脚本涉及到三个小脚本:1.sh 2.sh 3.sh --在这里为了方便,脚本名都是极其简单的。总的思路是给定一个特定的值n,作为输入参数的最大个数,然后将1,2,3...n作为脚本的输入参数,这通过脚本2.sh来实现,接着原样输出这些参数。如果这些参数全部都能输出,即代表给定的n是合理的。这通过脚本3.sh来实现。1.sh实现的功能是通过一个死循环,递增生成n,通过引用2.sh来判定n是否合理。具体可见如下脚本。

    首先我们来看看第一个脚本1.sh

    复制代码代码如下:

    #!/bin/bash
    i=0
    echo 0 > currnumber
    while true
    do
      i=$[$i+1]
      sh 2.sh $i
      if [ $? -ne 0 ];then
          echo $i > maxnumber
          exit 1
      else
          sed -i '1s/$/& '$i'/' currnumber
      fi
    done

    该脚本主要是提供了一个死循环,$i指的是可输入参数的个数,2.sh用于判定给定参数的个数是否合理,如果合理,则将该数值追加到currnumber这个文件中,如果不合理,则代表$i-1是shell能接受的最大参数个数。则将该数值输出到maxnumber文件中。

    currnumber文件的应用便于检测脚本的执行情况。原打算是echo $i >> currnumber,即每一个合理的数值都输出一行,考虑到文件有最大行数的限制,在这里,就将数值输出到一行。sed -i '1s/$/& '$i'/' currnumber即实现该功能,将$i的值添加到行尾。

    再来看看脚本2.sh

    复制代码代码如下:

    #!/bin/bash
    rm -f 1.test
    touch 1.test
    num=$1
    echo "#!/bin/bash" > 1.test
    echo "sh 3.sh" >> 1.test
    for ((i=1; i<=$num; i++))
    do
       sed -i '2s/$/& '$i'/' 1.test
    done
    sh 1.test

    脚本2实现的功能是将1,2,3...$i作为3.sh的输入参数,同样,sed -i '2s/$/& '$i'/' 1.test实现的是将1,2,3...n输出到一行。譬如如果$num=10,则1.test的内容如下所示:

    复制代码代码如下:

    #!/bin/bash
    sh 3.sh 1 2 3 4 5 6 7 8 9 10

    最后我们来看看脚本3.sh

    复制代码代码如下:

    #!/bin/bash
    echo 0 > 2.test
    num=$#
    for ((i=1;i<=$num;i++))
    do
       sed -i '1s/$/& '$i'/' 2.test
       shift 1
    done

    该脚本实现的是原样输出输入参数,并将该输入参数输出到2.test中。同样,sed -i '1s/$/& '$i'/' 2.test实现的是追加参数到一行。

    总结:

    1> sh 1.sh即可求出shell脚本允许的最大输入参数个数。

    2> 因条件有限,没有具体求出该值。但我们可跳过1.sh,单纯的通过2.sh来判定特定的数值。如,sh 2.sh 100000,经测试100000个输入参数没有问题。

    3> 该脚本的亮点是如何将特定的值追加到行尾,这主要通过sed -i '1s/$/& '$i'/' 2.test来实现,其实1s代表第一行。$代表行尾。

    4> 在vim中,0可跳到行首,$可跳到行尾。

    5> shift左移输入参数的位置。默认是左移1位。如shift 3表示原来的$4现在变成$1,原来的$5现在变成$2等等,原来的$1、$2、$3丢弃,$0不移动。

    6> 该脚本存在一个隐患,即文本文件的行有最大的字符限制。但将100000作为输入参数个数进行测试时,没有问题,说明文本文件一行还是能容纳相当数量的字符。

    PS: 在监测2.test的结果时,我们可以用watch cat 2.test,即每两秒查看一下2.test的内容,但该法有个弊端,数据较多时,无法在一个屏幕中显示,它只会显示前面固定的数据,新增的数据不会显示,但在该例中,我们更加关心的是数据是否增加。如下脚本可实现该功能:

    复制代码代码如下:

    #!/bin/bash
    while true
    do
       cat 2.test
       sleep 30
    done
  • 相关阅读:
    GoogleTest 之路2-Googletest 入门(Primer)
    GoogleTest 之路1-Generic Build Instructions编译指导总方案
    Tinyhttpd 知识点
    栈初始化
    ARM S3C2440 时钟初始化流程
    GNU 关闭 MMU 和 Icache 和 Dcache
    bootloader 关闭看门狗
    bootloader svc 模式
    Uboot S3C2440 BL1 的流程
    GNU 汇编 协处理器指令
  • 原文地址:https://www.cnblogs.com/Rozdy/p/4485488.html
Copyright © 2011-2022 走看看