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
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
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的内容如下所示:
sh 3.sh 1 2 3 4 5 6 7 8 9 10
最后我们来看看脚本3.sh
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的内容,但该法有个弊端,数据较多时,无法在一个屏幕中显示,它只会显示前面固定的数据,新增的数据不会显示,但在该例中,我们更加关心的是数据是否增加。如下脚本可实现该功能:
while true
do
cat 2.test
sleep 30
done
Shell最多支持多少个参数的更多相关文章
- Shell最多可以输入多少个参数?
在脚本编写过程中,通常会涉及到参数的输入.譬如,sh 1.sh 10 20,在执行1.sh这个脚本中,10即为第一个参数,20即为第二个参数.有时,就会有这个疑惑,即shell脚本最多可以支持多少个变 ...
- JVM最多支持多少个线程?
JVM最多支持多少个线程? McGovernTheory在StackOverflow提了这样一个问题: Java虚拟机最多支持多少个线程?跟虚拟机开发商有关么?跟操作系统呢?还有其他的因素吗? Edd ...
- Shell脚本编写3---Shell 传递参数
我们可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n.n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推…… 执行脚本,查看输出结果: 另外 ...
- JVM 最多支持多少个线程?
阅读本文大概需要 2.8 分钟. 原文:www.jb51.net/article/49087.htm McGovernTheory 在 StackOverflow 提了这样一个问题: Java 虚拟机 ...
- Java虚拟机最多支持多少个线程?
作者:miracle1919 来源:http://sina.lt/getP McGovernTheory在StackOverflow提了这样一个问题:Java虚拟机最多支持多少个线程?跟虚拟机开发商 ...
- 学习Shell脚本编程(第3期)_在Shell程序中使用的参数
位置参数 内部参数 如同ls命令可以接受目录等作为它的参数一样,在Shell编程时同样可以使用参数.Shell程序中的参数分为位置参数和内部参数等. 3.1 位置参数 由系统提供的参数称为位置参数.位 ...
- Shell脚本中判断输入参数个数的方法投稿:junjie 字体:[增加 减小] 类型:转载
Shell脚本中判断输入参数个数的方法 投稿:junjie 字体:[增加 减小] 类型:转载 这篇文章主要介绍了Shell脚本中判断输入参数个数的方法,使用内置变量$#即可实现判断输入了多少个参数 ...
- Win32程序支持命令行参数的做法(转载)
转载:http://www.cnblogs.com/lanzhi/p/6470406.html 转载:http://blog.csdn.net/kelsel/article/details/52759 ...
- shell如何向python传递参数,shell如何接受python的返回值
1.shell如何向python传递参数 shell脚本 python $sendmailCommandPath $optDate python脚本 lastDateFormat = sys.argv ...
随机推荐
- Android Error:You must supply a layout_width attribute……
出现这种情况的可能原因目前本人碰到的有: 1:在xml文件中某个属性名或者属性值写错,请务必仔细检查你有没有写错某个拼写. 2:当你在,比如TextView中,没有声明layout_width,经测试 ...
- java中print\println\printf的区别
print\println\printf的区别 print将它的参数显示在命令窗口,并将输出光标定位在所显示的最后一个字符之后. println 将它的参数显示在命令窗口,并在结尾加上换行符,将输出光 ...
- selenium+python 浏览器标签页跳转 switch_to_window
浏览器页面跳转方法记录: from selenium import webdriver import time browser = webdriver.Chrome() first_url='http ...
- Oracle使用%type类型的变量输出结果
使用%type关键字可以声明一个与指定列名称相同的数据类型,他通常紧跟在指定列名的后面. 使用%type的2个好处: 1.用户不必查看表中各个列的数据类型,就可以确保所定义的变量能够存储检索的数据. ...
- URL地址下载图片到本地
package test.dao; import eh.base.dao.DoctorDAO; import eh.entity.base.Doctor; import junit.framework ...
- c++异常详解
一.什么是异常处理 一句话:异常处理就是处理程序中的错误. 二.为什么需要异常处理,以及异常处理的基本思想 C++之父Bjarne Stroustrup在<The C++ Programming ...
- hg211g破解获取管理员密码,可以连接路由器。默认光猫来拨号。
先通过这种方式获取telecomadmin密码:1.使用useradmin用户登录设备2.在IE地址栏输入该路径”192.168.1.1/backupsettings.html”3.点击保存设备备份配 ...
- advance 模板 怎么生成module
advance 模板 怎么生成module namespace写什么如果是前台呢就是 frontend\modules\modulename\Module@我叫红领巾 module id有什么用bak ...
- Windows下访问VMware中tomcat
很多人都可能和我一样,运行在虚拟机上,开发时在windows上进行. 在linux上运行tomcat,并且windows中能ping通虚拟机,但就不能通过虚拟机ip访问到8080端口上的tomcat, ...
- FineUI Grid控件右键菜单的实现
FineUI官方Demo上一直没有Grid右键菜单的实现,其实从4.1.x的版本开始,允许添加自定义的事件监听(Listeners),所以要实现这个功能已经相当容易了. ExtJs右键菜单有很多种,对 ...