位置參数变量的作用主要用于脚本的传参。

位置參数变量的名称和作用都是确定不能改变的,但是该变量的内容是可以更改的,也就是变量的值。

位置參数变量如下:

位置参数变量 作用
$n n为数字,$0代表命令本身,$1-$9代表(脚本命令后的)第一到第九个参数,十以上的参数需要用大括号包含,如${10}${15}
$* 这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体。
$@ 这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待。
$# 这个变量代表命令行中所有参数的个数。

1、位置参数变量$n

$nn为数字,$0代表命令本身,$1-$9代表(脚本命令的)第一到第九个参数,十以上的参数需要用大括号包含,如${10}${15}。(这个是一个典型的向Shell脚本当中传递值的方式)

(1)示例:

# 定义一个shell脚本,简单的计算器,求两个数的和。

[root@Lyl tmp]# vim count.sh

# 脚本内容如下:

#!/bin/bash

# 给num1变量赋值是第一个参数
num1=$1
# 给num2变量赋值是第二个参数
num2=$2 # 变量sum是变量num1加变量num2的(其实上边的num1和num2的定义可以省略)
sum=$(($num1 + $num2))
# 注意:执行count.sh脚本后的第一个参数会传递给$1,第二个参数会传递给$2,
# 然后$num1和$num2进行求和,再赋值给sum变量。
# 但是Shell中自定义变量的默认类型是字符串类型,
# 而我们传入的两个数字类型的变量值,Shell默认都识别为字符串类型。
# 而这个时候我们就需要$(( ))把这个两个字符串类型的数值括起来,
# Shell才能知道要进行数值运算,里边的参数都是数值(Shell运算符中会详细讲)。
# 而$( )是括系统命令的,然后把该命令运行的结果,赋值给前面的变量,这个我们要注意。 #打印变量sum的值
echo $sum
echo $0 # 执行该脚本
[root@Lyl tmp]# chmod 755 count.sh
[root@Lyl tmp]# ./count.sh 22 66
88
./count.sh

(2)总结:

  • $1保存的是执行Shell命令之后的第一个参数,
  • $2保存的是执行Shell命令之后的第二个参数,
  • $0代表执行脚本的命令,如上边的./count.sh
  • 位置參数变量好处。

    其作用就是把执行脚本命令后输入的参数,传入到脚本中,使脚本中的变量可以灵活取值。
  • 位置參数变量的缺点。

    如果是一个普通的Linux用户,该脚本并不是自己写的。当你获得该脚本的时候,你是无法知道需要在脚本后边是否加参数,或者是加什么参数,脚本才能正确运行,是没有任何提示的。

    所以用位置參数变量传参,并不适合给普通用户来使用,一般是写的脚本自己用的时候,用的比较多。

提示:

位置參数变量也可以给函数中传参(其实就是自己给自己传值)。

给普通用户的脚本,传参的方式用read,会有提示,比较友好,我们之后说明。

2、位置参数变量$*$@

$*:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体。

$@:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待。

(1)用法

我们先写一个脚本来展示一下位置参数变量$*$@的用法:

# 定义一个脚本parameter.sh

[root@Lyl tmp]# vim parameter.sh

# 脚本内容如下:

#!/bin/bash

# 使用$*代表所有的参数(所有参数整体对待)
echo "The parameters \$* is:$*"
# 使用也代表所有参数(所有参数分开对待)
echo "The parameters \$@ is:$@" # 执行该脚本
[root@Lyl tmp]# chmod 755 parameter.sh
[root@Lyl tmp]# ./parameter.sh 11 22 33 44
The parameters $* is:11 22 33 44
The parameters $@ is:11 22 33 44

我们可以看到位置参数变量$*$@,都把执行脚本命令后边带的参数打印出来了。

(2)区别

位置参数变量$\*$@的区别是,$*把所有参数当作一个整体,而$@是先把11赋值给$@,在把22赋值给$@,以此类推,是分开的。

我们通过下边的例子来说明:

# 我们先简单的来说一下for循环
# 简单的for循环例子 for i in 1 2 3 4
do
echo $i
done # 说明:
# 在in后有几个数或者说是以空格隔开的变量(因为默认都是字符串类型),
# in后有几个变量,这个for循环就循环几次。
# 第一次循环,把第一个变量赋值给in前边的变量i,然后进入循环操作。
# 这只是for循环的一种形式,知道流程即可,后边会在详细说明Bash中的for循环。
# do和done就类似于Java中for循环的大括号(先这样理解就可以)。 # 写一个for循环脚本
[root@Lyl tmp]# vim for.sh # 脚本内容如下: #!/bin/bash
for i in 1 2 3 4
do
echo $i
done # 执行该脚本
[root@Lyl tmp]# chmod 755 for.sh
[root@Lyl tmp]# ./for.sh
1
2
3
4

示例区别:

# 定义一个脚本param.sh
[root@Lyl tmp]# vim param.sh # 脚本内容如下: #!/bin/bash # 定义for循环,in后面有几个值,for会循环多少次,
# 注意"S*"要用双引号括起来,每次循环会把in后面的值赋予变量i,
# Shell把$*中的所有参数看成是一个整体,所以这个for循环只会循环一次。 for i in "$*"
do
# 打印变量i的值
echo "循环了"$i
done echo "===============" # Shell把$@中的每个参数都看成是独立的,所以“$@"中有几个参数,就会循环几次。
# 注意两个for循环的变量名最好不相同,以示区别。相同也没关系。
for j in "$@"
do
# 打印变量j的值
echo "循环了"$j
done # 执行该脚本
[root@Lyl tmp]# chmod 755 param.sh
[root@Lyl tmp]# ./param.sh 11 22 33 44
循环了11 22 33 44
===============
循环了11
循环了22
循环了33
循环了44

图示:

3、位置参数变量$#

$#:这个变量代表命令行中所有参数的个数。

示例:

# 定义一个脚本parameter.sh

[root@Lyl tmp]# vim parameter.sh

# 脚本内容如下:

#!/bin/bash

# 使用$#代表所有参数的个数
echo "The parameters \$# is:$#" # 执行该脚本
[root@Lyl tmp]# chmod 755 parameter.sh
[root@Lyl tmp]# ./parameter.sh 11 22 33 44
The parameters $# is:4

『忘了再学』Shell基础 — 16、位置参数变量的更多相关文章

  1. 『忘了再学』Shell基础 — 11、变量定义的规则和分类

    目录 1.定义变量的规则 2.变量的分类 1.定义变量的规则 在定义变量时,有一些规则需要遵守 变量名称可以由字母.数字和下划线组成,但是不能以数字开头.如果变量名是2name则是错误的. 在Bash ...

  2. 『忘了再学』Shell基础 — 21、变量的测试与内容置换

    目录 1.什么是变量的测试与内容置换 2.变量的测试与内容置换 3.示例 例1: 例2: 例3: 1.什么是变量的测试与内容置换 我们之前说过,在Shell中,一个变量未定义,和一个变量为空值的输出效 ...

  3. 『忘了再学』Shell基础 — 10、Bash中的特殊符号(二)

    提示:本篇文章接上一篇文章,主要说说()小括号和{}大括号的区别与使用. 8.()小括号 ():用于一串命令执行时,()中的命令会在子Shell中运行.(和下面大括号一起说明) 9.{}大括号 {}: ...

  4. 『忘了再学』Shell基础 — 13、环境变量(一)

    目录 1.用户自定义的环境变量 (1)环境变量设置 (2)查询自定义环境变量 (3)删除自定义环境变量 2.系统自带的环境变量--PATH环境变量 (1)PATH环境变量 (2)PATH环境变量的作用 ...

  5. 『忘了再学』Shell基础 — 17、预定义变量

    目录 1.预定义变量$? 2.预定义变量$$和$! 我们之前说过,Shell中的变量不是按照变量值的类型来进行分类的,而是按照Linux系统中定义的变量类别来分类的. 预定义变量就是,事先把变量的名称 ...

  6. 『忘了再学』Shell基础 — 19、使用declare命令声明变量类型

    目录 1.declare命令介绍 2.声明数组变量类型 3.声明变量为环境变量 4.声明只读属性 5.补充: 1.declare命令介绍 Shell中所有变量的默认类型是字符串类型,如果你需要进行特殊 ...

  7. 『忘了再学』Shell基础 — 22、主要的环境变量配置文件说明

    目录 1.source命令 2.Linux系统中环境变量配置文件 (1)登录时生效的环境变量配置文件 (2)/etc/profile环境变量配置文件 (3)/etc/profile.d/*.sh环境变 ...

  8. 『忘了再学』Shell基础 — 3、echo命令的介绍与使用

    目录 1.echo命令的作用 2.echo命令的基本用法 3.echo命令的-e选项用法 4.echo命令一些特殊用法 (1)输出字符带有字体颜色 (2)输出字符带有背景颜色 在讲Shell脚本之前, ...

  9. 『忘了再学』Shell基础 — 24、Shell正则表达式的使用

    目录 1.正则表达式说明 2.基础正则表达式 3.练习 (1)准备工作 (2)*练习 (3).练习 (4)^和$练习 (5)[]练习 (6)[^]练习 (7)\{n\}练习 (8)\{n,\}练习 ( ...

随机推荐

  1. TL431常用电路整理

    熟悉电路制作的人大多对TL431并不陌生.由于TL431的动态抗阻的特性,其经常在电路设计当中被用于替代稳压二极管.不仅如此,TL431的开态响应速度快输出噪音低,并且价格低廉.因此受到电源工程师和初 ...

  2. stylus css tooltips 工具提示

    tooltips 纯css工具提示 bubbles-tooltips 查看效果 演示 安装 npm install tooltips --save 使用 在 gulp 中使用 gulp var gul ...

  3. Content Security Policy减少劫持

    Content Security Policy减少劫持 什么是CSP? CSP是由单词 Content Security Policy 的首单词组成,是HTML5带给我们的一套全新主动防御的体系,旨在 ...

  4. 腾讯云+社区开发者大会开启报名,WeGeek 邀你一起聊聊小程序

    刚满 2 岁的微信小程序,正给我们带来一种全新轻便的生活方式. 内测时的青涩还历历在目,到现在,小程序生态已日渐成熟.超过 150 万开发者在这里找到了自己的新天地,打磨出超过 100 万个小程序. ...

  5. react开发教程(三)组件的构建

    什么是组件 组件化就好像我们的电脑装机一样,一个电脑由显示器.主板.内存.显卡.硬盘,键盘,鼠标.... 组件化开发有如下的好处:降低整个系统的耦合度,在保持接口不变的情况下,我们可以替换不同的组件快 ...

  6. HTML5 Audio & Video 属性解析

    一.HTML 音频/视频 方法 play() play() 方法开始播放当前的音频或视频. var myVideo=document.getElementById("video1" ...

  7. Unity中让Update中的方法执行一次

    Unity中让Update中的方法执行一次 Unity中,很多时候,代码需要放在Update中时刻监测状态,一旦状态符合,又只需要代码执行一次:其实可以通过设置控制量的方式,让代码只执行一次:方法:设 ...

  8. prometheus之查询语言

    PromQL(Prometheus Query Language)是 Prometheus 自己开发的表达式语言,语言表现力很丰富,内置函数也很多.使用它可以对时序数据进行筛选和聚合. 一.PromQ ...

  9. JavaScript 遍历对象、数组总结

    在日常工作过程中,我们对于javaScript遍历对象.数组的操作是十分的频繁的,今天抽空把经常用到的方法小结一下,方便今后参考使用!   javaScript遍历对象总结     1.使用Objec ...

  10. ubantu系统之jdk切换使用

    安装 jdk7: $ sudo apt-get update $ sudo apt-get install openjdk-7-jdk 安装 jdk1.8:sudo add-apt-repositor ...