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

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

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

  • 0: shell脚本的名字;

  • NN是1开始的正整数shell脚本的第N个位置参数,当N是个位数数字,可以表示为$N;当N非个位数时候,需要 { }  ,即${N} ;

  • #:shell脚本的参数的个数,以十进制计数;

  • *:参数列表

  • @:参数列表

对于前面的三个很好理解,但是*和@都是参数列表,难道说*=@吗?第一反应就是:这不可能,一定是个坑。

到网上查找资料,在Chet Ramey , Brian Fox 著 邵加超(Jerry Fleming)译注的《BASH中文文档》看到说明介绍:



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



真对不起我的语文老师,几遍下来,依然觉得很生涩,似懂非懂。只能动手结合实例理解:



#!/usr/bin/env bash
#
#测试脚本的位置参数: @ 和 *
#
echo 'This is $@ :>>>|'$@
echo 'This is $* :>>>|'$*


Shell编程 详解特殊变量之位置参数_脚本_03

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

看来要出大招Shell编程 详解特殊变量之位置参数_位置参数_04



Shell编程 详解特殊变量之位置参数_脚本_05



思路把参数列表传递给for循环的i变量,然后打印$i,

一言不合,说干就干Shell编程 详解特殊变量之位置参数_shell_06



#!/usr/bin/env bash
#
#测试脚本的位置参数: @ 和 *
#
echo 'begin testing $@......'
for i in $@
do
    echo $i
done
echo 'begin testing $*......'
for i in $*
do
    echo $i
done


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

什么情况...还是一样的,难道我的理解错了?再来:



#!/usr/bin/env bash
#
#测试脚本的位置参数: @ 和 *
#
echo 'begin testing $@......'
for i in "$@"
do
    echo $i
done
echo 'begin testing $*......'
for i in "$*"
do
    echo $i
done


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

真相浮出水面(我果然对不起语文老师)...再看一眼正确演示的脚本↓↓↓↓

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

由此可以得出最后结论

  • 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命令展开

Shell编程 详解特殊变量之位置参数_脚本_10

看来10万是小意思嘛...再来个0,一百万Shell编程 详解特殊变量之位置参数_位置参数_04

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

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

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

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

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

大功告成Shell编程 详解特殊变量之位置参数_位置参数_15看来shell脚本最多支持314590个参数。






 我是有底线的Shell编程 详解特殊变量之位置参数_shell_16