徐冬丽 发表于 2018-8-27 11:22:30

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

  今天我们来探讨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个参数,运行之:

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

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

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

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

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

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

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

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

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

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


页: [1]
查看完整版本: Shell编程 详解特殊变量之位置参数