『忘了再学』Shell基础 — 16、位置参数变量
位置參数变量的作用主要用于脚本的传参。
位置參数变量的名称和作用都是确定不能改变的,但是该变量的内容是可以更改的,也就是变量的值。
位置參数变量如下:
| 位置参数变量 | 作用 |
|---|---|
$n |
n为数字,$0代表命令本身,$1-$9代表(脚本命令后的)第一到第九个参数,十以上的参数需要用大括号包含,如${10}、${15}。 |
$* |
这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体。 |
$@ |
这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待。 |
$# |
这个变量代表命令行中所有参数的个数。 |
1、位置参数变量$n
$n:n为数字,$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、位置参数变量的更多相关文章
- 『忘了再学』Shell基础 — 11、变量定义的规则和分类
目录 1.定义变量的规则 2.变量的分类 1.定义变量的规则 在定义变量时,有一些规则需要遵守 变量名称可以由字母.数字和下划线组成,但是不能以数字开头.如果变量名是2name则是错误的. 在Bash ...
- 『忘了再学』Shell基础 — 21、变量的测试与内容置换
目录 1.什么是变量的测试与内容置换 2.变量的测试与内容置换 3.示例 例1: 例2: 例3: 1.什么是变量的测试与内容置换 我们之前说过,在Shell中,一个变量未定义,和一个变量为空值的输出效 ...
- 『忘了再学』Shell基础 — 10、Bash中的特殊符号(二)
提示:本篇文章接上一篇文章,主要说说()小括号和{}大括号的区别与使用. 8.()小括号 ():用于一串命令执行时,()中的命令会在子Shell中运行.(和下面大括号一起说明) 9.{}大括号 {}: ...
- 『忘了再学』Shell基础 — 13、环境变量(一)
目录 1.用户自定义的环境变量 (1)环境变量设置 (2)查询自定义环境变量 (3)删除自定义环境变量 2.系统自带的环境变量--PATH环境变量 (1)PATH环境变量 (2)PATH环境变量的作用 ...
- 『忘了再学』Shell基础 — 17、预定义变量
目录 1.预定义变量$? 2.预定义变量$$和$! 我们之前说过,Shell中的变量不是按照变量值的类型来进行分类的,而是按照Linux系统中定义的变量类别来分类的. 预定义变量就是,事先把变量的名称 ...
- 『忘了再学』Shell基础 — 19、使用declare命令声明变量类型
目录 1.declare命令介绍 2.声明数组变量类型 3.声明变量为环境变量 4.声明只读属性 5.补充: 1.declare命令介绍 Shell中所有变量的默认类型是字符串类型,如果你需要进行特殊 ...
- 『忘了再学』Shell基础 — 22、主要的环境变量配置文件说明
目录 1.source命令 2.Linux系统中环境变量配置文件 (1)登录时生效的环境变量配置文件 (2)/etc/profile环境变量配置文件 (3)/etc/profile.d/*.sh环境变 ...
- 『忘了再学』Shell基础 — 3、echo命令的介绍与使用
目录 1.echo命令的作用 2.echo命令的基本用法 3.echo命令的-e选项用法 4.echo命令一些特殊用法 (1)输出字符带有字体颜色 (2)输出字符带有背景颜色 在讲Shell脚本之前, ...
- 『忘了再学』Shell基础 — 24、Shell正则表达式的使用
目录 1.正则表达式说明 2.基础正则表达式 3.练习 (1)准备工作 (2)*练习 (3).练习 (4)^和$练习 (5)[]练习 (6)[^]练习 (7)\{n\}练习 (8)\{n,\}练习 ( ...
随机推荐
- 11_滞后补偿器_Lag Compensator_Matlab_Simulink
下图中左边没有补偿器的稳态误差,右边是有只猴补偿器的稳态误差,H(s)为滞后补偿器的原因是H(s)bode图的相位图是负的 其中黄线是没有滞后补偿器的,蓝线是滞后补偿器中p = 1 ,q = 9的曲线 ...
- 印度下架54款中国APP,中东政策逐年收紧,伊拉克成蓝海市场
2月14日,印度电子和信息技术部以"安全威胁"为由对有中国基因的54款App下达禁令,15日,印度税务部门对某些在印中资企业多个场所进行搜查. 本批下架的App中主要以应用类App ...
- 关于CDN那些事
对于前端性能优化我们不得不了解的几个知识点:CDN.HTTP header信息 今天我就来谈谈我对cdn的理解 1.CDN是什么:CDN全称是Content Delivery Network,即内容分 ...
- 切图崽的自我修养-[ES6] 迭代器Iterator浅析
Iterator 这真是毅种循环 Iterator不是array,也不是set,不是map, 它不是一个实体,而是一种访问机制,是一个用来访问某个对象的接口规范,为各种不同的数据结构提供统一的访问机制 ...
- es6零碎记忆
1:substring 和 substr var str = '0123456789' console.log(str.substring(1)); //123456789 console.log(s ...
- 使用Canvas和JavaScript做一个画板
本文同步于个人博客:https://zhoushuo.me/blog/2018/03/11/drawing-borad/ 前些天学习了HTML5的<canvas>元素,今天就来实践一下,用 ...
- win11拖动窗口造成崩溃的问题
问题描述 拖动窗口,随机概率出现 屏幕闪烁 屏幕黑屏 屏幕瞬间分屏 解决方法 windowes11贴吧大神给的方案 1,按下 win键+R 输入 regedit 进入注册表,进入以下路径:计算机\HK ...
- 二. 手写SpringMVC框架
1.1 新建DispatcherServlet 1.2 在src目录下,新建applicationContext.xml <?xml version="1.0" encodi ...
- Java线程内存模型-JVM-底层原理
public class Demo1 { private static boolean initFlag=false; public static void main(String[] args) t ...
- grpc流模式-go实现
目录 1. 什么是数据流 2. grpc的四种数据流 2.1 简单模式 2.2 服务端数据流模式 2.3 客户端数据流模式 2.4 双向数据流 3. 上代码 3.1 代码目录 3.2 编写stream ...