今天我们来探讨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 $idoneecho 'begin testing $*......'for i in $*do echo $idone
什么情况...还是一样的,难道我的理解错了?再来:
#!/usr/bin/env bash##测试脚本的位置参数: @ 和 *#echo 'begin testing $@......'for i in "$@"do echo $idoneecho 'begin testing $*......'for i in "$*"do echo $idone
真相浮出水面(我果然对不起语文老师)...再看一眼正确演示的脚本↓↓↓↓
由此可以得出最后结论:
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命令展开
-bash: ./testargs.sh: Argument list too long 咦...看来100有点承受不住,再来多几次尝试
314580可以,314595不行...有种曙光即现的感觉...
本文出自 “Zhaoqi Learn To Linux” 博客,请务必保留此出处http://zhaoqifly.blog.51cto.com/3500118/1837611