您的位置:首页 > 运维架构 > Shell

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

2016-08-13 17:22 309 查看
今天我们来探讨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,后面内容用命令组合追加:

[root@IP70-CentOS7 ~]# >>echo 'echo This is \$\{10\} \:\|${10}' >> testargs.sh
#往脚本追加一条显示语句。提示位置参数是多少
[root@IP70-CentOS7 ~]# >>./testargs.sh $(seq 1 314551)
#执行脚本,参数由seq命令展开



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





-bash: ./testargs.sh: Argument list too long 咦...看来100有点承受不住,再来多几次尝试



314580可以,314595不行...有种曙光即现的感觉...



大功告成

看来shell脚本最多支持314590个参数。

我是有底线的

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  脚本 shell 位置参数