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
时间: 2024-08-02 09:15:17

Shell最多可以输入多少个参数?的相关文章

Shell最多支持多少个参数

本文转自:http://www.jb51.net/article/56548.htm 这篇文章主要介绍了Shell最多支持多少个参数?本文是对Shell最多可以输入多少个参数的一篇测试文章,需要的朋友可以参考下 在脚本编写过程中,通常会涉及到参数的输入.譬如,sh 1.sh 10 20,在执行1.sh这个脚本中,10即为第一个参数,20即为第二个参数.有时,就会有这个疑惑,即shell脚本最多可以支持多少个变量呢?疑惑之余,编写了如下脚本,可求出Shell脚本中可输入参数的最大个数. 该脚本涉及

实战c++中的vector系列--使用sort算法对vector&lt;unique_ptr&lt;string&gt;&gt;进行排序(sort函数出错“应输入 2 个参数,却提供了 3 个)

之前博客写了对vector使用sort算法进行的排序,之前也写到过vector<unique_ptr<string>>的一些处理方法. 今天就写一下对vector<unique_ptr<string>>使用sort算法进行排序. #include<iostream> #include<string> #include<vector> #include<algorithm> #include<memory&

ibatis输入多个参数

ibatis输入多个参数 在ibatis中,会发现其输入参数只能有一个,于是当出现需要进行多个输入参数的时候,就要想点办法了,我看到的有以下两种比较好的方法能够解决这个问题1) 用String代替<select id="checkLogin" parameterClass="java.lang.String" resultClass="java.lang.Integer">SELECT count(*) AS value FROM u

(三)、利用命令行参数输入多个参数,判断该数组是否为回文数组

1 /* 2 利用命令行参数输入多个参数,并赋值给一数组,同时判断该数组是否为回文数组 3 –PS:例如数组{“123”,”222”,”333”,”222”,”123”}就是回文数组,即元素倒置过后与原元素一样 4 */ 5 package com.gen; 6 public class ArgumentHuiwen { 7 public static void main(String args[]) 8 { 9 int num[]=new int[100]; 10 int len=args.l

Eclipse输入命令行参数

想要在Eclipse中输入命令行参数,可以在目录中该程序上右键,选择“Run As",选择”Run configurations",如图: 然后输入命令行参数: 点击Apply和Run,就会将命令行参数传给我们的程序. public static void main(String[] args) { System.out.println(args[0]); System.out.println(args[1]); } 这样就会再控制台上输出:test a 注意,我们只要将"a

通过输入命令行参数来控制程序

今天突然想到类似adb.ffmpeg这样的程序是怎么实现的,通过命令行输入不同的参数就可以执行不同的命令. 研究了一下,其实实现的逻辑很简单,以C#控制台程序为例,Main函数是这样的 class Program { static void Main(string[] args) { } } 其中string [ ] args便是命令行参数了,简单验证一下,新建一个命令行程序,写入这样一段代码 class Program { static void Main(string[] args) { f

python如何利用input函数输入多个参数?

python进行交互式输入过程中,一般使用input()函数来接受键盘的输入. 如果考虑这样的应用:  程序需要多个参数,并且希望每输入一个参数就进行换行,即希望一次输入多个参数.   关于这样问题网络上有一些帖子,但是总是没有讲到要点,这里解析如下. 关键知识点:  1.input函数接受输入的是一个字符串.  2.对于多个变量的赋值时,等号右边应该为一个列表list  x,y=[列表] 有了上面的知识点,现在对不同输入的代码如下: #input的输入是一个字符串. x=input("请输入1

使用getopts处理shell中的输入参数

在编写shell脚本中,经常要处理一些输入参数,在使用过程中发现getopts更加方便,能够很好的处理用户输入的参数和参数值. getopts用于处理用户输入参数,举例说明使用方法: while getopts :a:b:cdefg opt; do case $opts in a) do sth; ...... cde) do another; esac done 几个重要变量: OPTIND:getopts使用OPTIND作为索引,来处理下一个需要处理的参数,记录当前的状态. OPTARG:在

Shell脚本的输入参数处理

参数处理-Shell传入参数的处理 1. $# 传递到脚本的参数个数 2. $* 以一个单字符串显示所有向脚本传递的参数.与位置变量不同,此选项参数可超过9个 3.脚本运行的当前进程ID号  4. $! 后台运行的最后一个进程的进程ID号  5. [email protected] 与$#相同,但是使用时加引号,并在引号中返回每个参数  6. $- 显示shell使用的当前选项,与set命令功能相同  7. $? 显示最后命令的退出状态.0表示没有错误,其他任何值表明有错误. 变量含义: $0