设为首页 收藏本站
查看: 2008|回复: 0

Shell编程 详解特殊变量之位置参数

[复制链接]

尚未签到

发表于 2018-8-27 11:22:30 | 显示全部楼层 |阅读模式
  今天我们来探讨shell编程的特殊变量:位置变量。
  首先我创建了一个testargs.sh的小脚本:
#!/usr/bin/env bash  
#
  
# Author: jacky18676887374@aliyun.com
  
# date: 20160813-19:30:59
  
# Vervion: 0.0.1
  
# Description:
  
# Synopsis:
  
#
  
#测试脚本的位置参数
  
#
  
echo 'This is $# :>>>|'$#
  
echo 'This is $@ :>>>|'$@
  
echo 'This is $* :>>>|'$*
  
echo 'This is $0 :>>>|'$0
  
echo 'This is $1 :>>>|'$1
  
echo 'This is $2 :>>>|'$2
  
echo 'This is $3 :>>>|'$3
  
echo 'This is $9 :>>>|'$9
  
echo 'This is $10 :>>>|'$10
  
echo 'This is ${10} :>>>|'${10}
  
echo 'This is $11 :>>>|'$11
  
echo 'This is ${11} :>>>|'${11}
  
echo 'This is ${-1} :>>>|'${-1}
  给脚本a-t共计20个参数,运行之:
DSC0000.png

  由实例我们可以得出初步结论:

  •   0: shell脚本的名字;
  •   NN是1开始的正整数shell脚本的第N个位置参数,当N是个位数数字,可以表示为$N;当N非个位数时候,需要 { }  ,即${N} ;
  •   #:shell脚本的参数的个数,以十进制计数;
  •   *:参数列表
  •   @:参数列表
  对于前面的三个很好理解,但是*和@都是参数列表,难道说*=@吗?第一反应就是:这不可能,一定是个坑。
  到网上查找资料,在Chet Ramey , Brian Fox 著 邵加超(Jerry Fleming)译注的《BASH中文文档》看到说明介绍:
DSC0001.png

  真对不起我的语文老师,几遍下来,依然觉得很生涩,似懂非懂。只能动手结合实例理解:
#!/usr/bin/env bash  
#
  
#测试脚本的位置参数: @ 和 *
  
#
  
echo 'This is $@ :>>>|'$@
  
echo 'This is $* :>>>|'$*
DSC0002.png

  貌似看不出来个所以然,恍然想起echo命令是以行显示内容,列表都变成一行输出了。
  看来要出大招了 DSC0003.gif
DSC0004.png

  
  思路把参数列表传递给for循环的i变量,然后打印$i,
  一言不合,说干就干 DSC0005.gif
#!/usr/bin/env bash  
#
  
#测试脚本的位置参数: @ 和 *
  
#
  
echo 'begin testing $@......'
  
for i in $@
  
do
  
    echo $i
  
done
  
echo 'begin testing $*......'
  
for i in $*
  
do
  
    echo $i
  
done
DSC0006.png

  什么情况...还是一样的,难道我的理解错了?再来:
#!/usr/bin/env bash  
#
  
#测试脚本的位置参数: @ 和 *
  
#
  
echo 'begin testing $@......'
  
for i in "$@"
  
do
  
    echo $i
  
done
  
echo 'begin testing $*......'
  
for i in "$*"
  
do
  
    echo $i
  
done
DSC0007.png

  真相浮出水面(我果然对不起语文老师)...再看一眼正确演示的脚本↓↓↓↓
   DSC0008.png
  由此可以得出最后结论

  •   0: shell脚本的名字;
  •   NN是1开始的正整数shell脚本的第N个位置参数,当N是个位数数字,可以表示为$N;当N非个位数时候,需要 { }  ,即${N} ;
  •   #:shell脚本的参数的个数,以十进制计数;
  •   *:参数列表,当"$*"时,将所有参数当成一个单位;
  •   @:参数列表,当"$@"时,每个参数独立,是多单位的列表清单。
  
  到底脚本支持多少个参数呢?
  当测试到N的时候,就忍不住想,shell脚本到低支持多少个参数呢?有什么方法验证呢?抓耳挠腮...还是想到了个笨方法:
  思路:seq命令将1..N展开做参数,给shell脚本执行。写好脚本,只写了第一行#!/bin/bash,后面内容用命令组合追加:
[root@IP70-CentOS7 ~]# >>echo 'echo This is \$\{10\} \:\|${10}' >> testargs.sh  
#往脚本追加一条显示语句。提示位置参数是多少
  
[root@IP70-CentOS7 ~]# >>./testargs.sh $(seq 1 314551)
  
#执行脚本,参数由seq命令展开
DSC0009.png

  看来10万是小意思嘛...再来个0,一百万
DSC00010.png

  -bash: ./testargs.sh: Argument list too long 咦...看来100有点承受不住,再来多几次尝试
   DSC00011.png
  314580可以,314595不行...有种曙光即现的感觉...
   DSC00012.png
  大功告成 DSC00013.gif 看来shell脚本最多支持314590个参数。
  
  
  
  
  
  我是有底线的 DSC00014.gif



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-557255-1-1.html 上篇帖子: shell下的进度条和最大最小平均值 下篇帖子: Shell脚本编程——条件测试
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表