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

时间:2021-11-20 15:34:31

今天我们来探讨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编程 详解特殊变量之位置参数

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

  • 0: shell脚本的名字;

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

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

  • *:参数列表

  • @:参数列表

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

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



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



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



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


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

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

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



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



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

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



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


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

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



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


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

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

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

由此可以得出最后结论

  • 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万是小意思嘛...再来个0,一百万Shell编程 详解特殊变量之位置参数

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

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

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

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

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

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






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




本文出自 “Zhaoqi Learn To Linux” 博客,请务必保留此出处http://zhaoqifly.blog.51cto.com/3500118/1837611