『忘了再学』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,\}练习 ( ...
随机推荐
- 转Gerber和拼版
1 Gerber 这个网上有现成的教程:(不要写网上能找到的资料-敏捷开发) AD 导出Gerber :https://jingyan.baidu.com/article/3c48dd3494181c ...
- mplab使用小知识
选择Debugger->Select Tool->MPLAB SIM可以使用MPALB中的软件调试 StopWatch可以观察程序运行时间 注意:在测试时需要注意红圈内晶振是不是和单片机上 ...
- 检查浏览器支持Webp
什么是Webp? Webp 是一种支持有损压缩和无损压缩的图片文件格式,派生自图像编码格式 VP8.根据 Google 的测试,无损压缩后的 WebP 比 PNG 文件少了 45% 的文件大小,即使这 ...
- java中方法重载是什么, 实际中到底有什么意义, 用处?请举例
7.3 方法重载(overload) 当几个方法有相同的方法名,但参数个数不同或参数类型不同时,就涉及方法重载 方法重载有什么意义呢?在公司里编程,有时候一个方法名,要用到很多次,而且每次跟每次的参 ...
- Blazor组件自做一 : 使用JS隔离封装viewerjs库
Viewer.js库是一个实用的js库,用于图片浏览,放大缩小翻转幻灯片播放等实用操作 本文相关参考链接 JavaScript 模块中的 JavaScript 隔离 Viewer.js工程 Blazo ...
- 什么是机器学习的特征工程?【数据集特征抽取(字典,文本TF-Idf)、特征预处理(标准化,归一化)、特征降维(低方差,相关系数,PCA)】
2.特征工程 2.1 数据集 2.1.1 可用数据集 Kaggle网址:https://www.kaggle.com/datasets UCI数据集网址: http://archive.ics.uci ...
- 【Oracle】EXPDP和IMPDP数据泵进行导出导入的方法
一.expdp/impdp和exp/imp 客户端工具 1.exp和imp是客户端工具程序,它们既可以在客户端使用,也可以在服务端使用. 服务端工具 2.expdp和impdp是服务端的工具程序,他们 ...
- Mysql集群搭建-实操
集群安装--准备工作 官网地址 https://dev.mysql.com/doc/refman/5.7/en/mysql-cluster-install-linux-binary.html 一.环境 ...
- 改造@vue/cli项目为服务端渲染-ServerSideRender
VUE SEO方案二 - SSR服务端渲染 在上一章中,我们分享了预渲染的方案来解决SEO问题,个人还是很中意此方案的,既简单又能解决大部分问题.但是也有着一定的缺陷,所以我们继续来看下一个方案--服 ...
- [源码解析] TensorFlow 之 分布式变量
[源码解析] TensorFlow 之 分布式变量 目录 [源码解析] TensorFlow 之 分布式变量 1. MirroredVariable 1.1 定义 1.2 相关类 1.2.1 类体系 ...