我的编程空间,编程开发者的网络收藏夹
学习永远不晚

怎么在Shell中实现特殊变量和扩展变量

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

怎么在Shell中实现特殊变量和扩展变量

本篇文章为大家展示了怎么在Shell中实现特殊变量和扩展变量,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

特殊变量

在Shell中的特殊变量主要分别两种位置参数变量、状态变量两种。

位置参数变量

Shell中的位置参数变量主要是指0、0、1、$#等,主要用于从命令行、函数或脚本执行等地方传递参数。详细说明如下所示:

  • $0:获取当前执行的Shell脚本的文件名,如脚本中包含路径,则输出也包括路径

  • $n:获取当前执行的Shell脚本的第n个参数值,如n>9,则需要使用用大括号,如${10},各参数间用空格进行分隔

  • $#:获取当前执行的Shell脚本传入参数的总个数

  • $*:获取当前执行的Shell所有传入参数,如不加引号则与$@功能相同,如果添加双引号**"∗",则表示将所有传入参数视为单个字符串∗∗,相当于"∗",则表示将所有传入参数视为单个字符串∗∗,相当于"1 223"

  • $@:获取当前执行的Shell所有传入参数,**如不加引号则与$*功能相同,如果添加双引号"@",则表示将所有传入参数视为独立的字符串∗∗,相当于"@",则表示将所有传入参数视为独立的字符串∗∗,相当于"1" "2""2""3"

当"∗"和"∗"和"@"都添加双引号时,两者的功能有所区别;如不加,则功能相同,无区别。

位置参数变量示例

示例一:

[root@localhost Test]# cat para.sh#!/bin/bashecho $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11} ${12} ${13} ${14} ${15}echo '$0 is:' $0echo '$1 is:' $1echo '$12 is:' ${12}echo '$# is:' $#echo '$* is:' $*echo '"$*"is:' "$*"echo '$@ is:' $@echo '"$@"is:' "$@"# 输出结果[root@localhost Test]# bash ~/Test/para.sh {a..z}a b c d e f g h i j k l m n o$0 is: /root/Test/para.sh$1 is: a$12 is: l$# is: 26$* is: a b c d e f g h i j k l m n o p q r s t u v w x y z"$*"is: a b c d e f g h i j k l m n o p q r s t u v w x y z$@ is: a b c d e f g h i j k l m n o p q r s t u v w x y z"$@"is: a b c d e f g h i j k l m n o p q r s t u v w x y z

传入的参数个数多于脚本定义的参数时,则多出的参数会忽略

传入的参数中如使用双引号,则会当作一个参数值进行传递

位置参数如大于9,需要使用${}进行传递

示例二:

[root@localhost Test]# cat testposition.sh #!/bin/bashecho '$# $1 $2 $3 $* $@'echo $# $1 $2 $3 $* $@echo "************"echo '$*'for tmp in $* do echo $tmp doneecho "************"echo "@@@@@@@@@@@@"echo '$@'for temp in $@ do echo $temp doneecho "@@@@@@@@@@@@"echo '"*"*"*"*"*"*'echo '$*'for i in "$*" do echo $i doneecho '"*"*"*"*"*"*'echo '"@"@"@"@"@"@'echo '$@'for j in "$@" do echo $j doneecho '"@"@"@"@"@"@'[root@localhost Test]# bash testposition.sh "Hello Jack" Welcome "to Shanghai"$# $1 $2 $3 $* $@3 Hello Jack Welcome to Shanghai Hello Jack Welcome to Shanghai Hello Jack Welcome to Shanghai************$* # 未加双引号,所以会输出全部参数,则第一个和第三个参数会拆开HelloJackWelcometoShanghai************@@@@@@@@@@@@$@ # 未加双引号,所以会输出全部参数,则第一个和第三个参数会拆开HelloJackWelcometoShanghai@@@@@@@@@@@@"*"*"*"*"*"*$* # 添加双引号后,传入的参数全部当一个参数进行输出Hello Jack Welcome to Shanghai"*"*"*"*"*"*"@"@"@"@"@"@$@ # 添加双引号后,传入的参数全部当独立的参数进行输出Hello JackWelcometo Shanghai"@"@"@"@"@"@

状态变量

  • $?:获取上一个命令或脚本的执行状态值(0:成功,其他:失败)

  • $$:获取当前执行的Shell的进程号(PID)

  • $!:获取上一个在后台工作的进程的进程号

  • **$_**:获取在些之前执行的命令或脚本的最后一个参数

以上四个状态变量,仅$?常用,其他三个了解即可。

在日常使场景中,$?主要用法如下所示:

判断命令和脚本是否执行成功

如脚本中调用exit 数字,则会返回该数字给$?

如在函数中,则可以通过return 数字将该数字返回给$?

状态变量示例

$?示例:

[root@localhost Test]# ll /etc/profile-rw-r--r--. 1 root root 1819 4月 11 2018 /etc/profile[root@localhost Test]# echo $?0[root@localhost Test]# ll /etc/profildls: 无法访问/etc/profild: 没有那个文件或目录[root@localhost Test]# echo $?2

$$示例:

[root@localhost Test]# cat testPID.sh#!/bin/bashecho $$ > /tmp/test.pidsleep 300[root@localhost Test]# bash testPID.sh & # 将当前脚本调用到后台执行[1] 1671[root@localhost Test]# ps -ef | grep testPID | grep -v greproot 1671 23706 0 16:37 pts/0 00:00:00 bash testPID.sh # 查询PID

!示例:!示例:!功能类似于$$,只不过是获取上一次执行脚本的PID

[root@localhost Test]# bash testPID.sh &[1] 24078[root@localhost Test]# echo $!24078 # 打印上一次在后台执行的进程号[root@localhost Test]# ps -ef | grep testPID | grep -v greproot 24078 23706 0 16:42 pts/0 00:00:00 bash testPID.sh

$_示例:

[root@localhost Test]# bash para.sh {a..z}a b c d e f g h i j k l m n o$0 is: para.sh$1 is: a$12 is: l$# is: 26$* is: a b c d e f g h i j k l m n o p q r s t u v w x y z"$*"is: a b c d e f g h i j k l m n o p q r s t u v w x y z$@ is: a b c d e f g h i j k l m n o p q r s t u v w x y z"$@"is: a b c d e f g h i j k l m n o p q r s t u v w x y z[root@localhost Test]# echo $_z # 打印最后一个传入的参数值

Bash 内置变量

常用的内部命令有echo、eval、exec、export、read、shift、exit。

echo

主要用于打印信息,其命令格式如下所示:

echo [options] args

常用参数如下所示:

参数选项说明
-n不换行输出内容
-e解析转义字符

echo常用转义字符如下:

转义字符说明
\n换行
\r回车
\tTab
\b退格
\v纵向制表符

eval

当Shell程序运行到eval语句时,将读入参数args,并将它们组合成一个新的命令而后执行。其命令格式如下所示:

eval args

exec

exec主要用于在不创建新的子进程的情况下,转而执行指定的命令,当指定命令执行完后,则终止该进程。其命令格式如下所示:

exec args

当使用exec打开文件后,read命令每次都会将文件指针移动到下一行进行读取,直至结束。因此常用来处理文件内容。

read

从标准输入读取变量或字符串等信息并传递给其他变量,其命令格式如下所示

read args

shift

对传入的位置参数依次向左移动一个位置,并使用位置参数$#减1,直至0为止。其命令格式如下所示:

shift postition args

shift如果不带参数,则默认左移1位

如传入的参数为112 3,如执行一次shift,则之前的3,如执行一次shift,则之前的3变成2,2,2变成1,1,1消失。

exit

常用于退出Shell,在日常使用过程中可使用exit num来自定义返回状态数。

Bash 内置变量示例

echo

[root@localhost Test]# echo "Test";echo "Dao"TestDao[root@localhost Test]# echo -n "Test";echo "Dao"TestDao[root@localhost Test]# echo -e "Test\tName\n Dao"Test Name Dao

eval

[root@localhost Test]# cat eval.sh#!/bin/bashecho "No eval"echo \$$#echo "Add eval"eval echo \$$#[root@localhost Test]# bash eval.sh a bNo eval$2 # 未添加evel时,$#为2,则输出$2Add evalb # 添加evel后,则重新对传入的参数进行解析,则输出传入的第2个参数

exec

[root@localhost Test]# exec lseval.sh para.sh ping.sh testPID.sh testposition.sh[admin@localhost ~]$ # 在执行exec后则终止当前Shell进程,因此从root用户退出到普通用户# 与read一起读取文件[root@localhost ~]# seq 5 > /tmp/rand.log[root@localhost ~]# cat /tmp/rand.log 12345[root@localhost Test]# cat exec.sh#!/bin/bashexec < /tmp/rand.logwhile read line do echo $line doneecho "Completed"[root@localhost Test]# bash exec.sh12345Completed

read

可以参考公众号中read命令一文

shift

[root@localhost Test]# cat shift.sh#!/bin/bashecho $1 $2 $3 $4 $5until [ -z $1 ]do echo $@ shift 1done[root@localhost Test]# bash shift.sh {1..5}1 2 3 4 51 2 3 4 52 3 4 53 4 54 55

变量扩展

变量扩展说明

Shell中变量扩展说明如下所示:

  • ${var}:返回${var}的内容

  • ${#var}:返回${var}的字符长度

  • ${var:offset}:返回${var}从位置offset之后开始提取字符至结束

  • ${var:offset:length}:返回${var}从offset之后,提取长度为length的字符

  • ${var#word}:返回从${var}开头开始删除最短匹配的word子符串

  • ${var##word}:返回从${var}开头开始删除最长匹配的word子符串

  • ${var%word}:返回从${var}结尾开始删除最短匹配的word子符串

  • ${var%%word}:返回从${var}结尾开始删除最长匹配的word子符串

  • ${var/oldstring/newstring}:使用newstring替换第一个匹配的字符oldstring

  • ${var//oldstring/newstring}:使用newstring替换所有匹配的字符oldstring

  • ${var:-word}:如果变量var的值为空或未赋值,则将word做为返回值,常用于防止变量为空或未定义而导致的异常

  • ${var:=word}:如果变量var的值为空或未赋值,则将word赋值给var并返回其值。

  • ${var:?word}:如果变量var的值为空或未赋值,则将word做为标准错误输出,否则则输出变量的值,常用于捕捉因变量未定义而导致的错误并退出程序

  • ${var:+word}:如果变量var的值为空或未赋值,则什么都不做,否则word字符将替换变量的值

其中${var:-word}、${var:=word}、${var:?word}、${var:+word}中的冒号也可以省略,则将变量为空或未赋值修改为未赋值,去掉了为空的检测, 即运算符仅检测变量是否未赋值

变量扩展示例

[root@localhost init.d]# var="This is test string"[root@localhost init.d]# echo $varThis is test string[root@localhost init.d]# echo ${var}This is test string[root@localhost init.d]# echo ${#var} # 统计字符长度19[root@localhost init.d]# echo ${var:5} # 从第5个位置开始截取字符is test string[root@localhost init.d]# echo ${var:5:2} # 从第5个位置开始截取2个字符is[root@localhost init.d]# echo ${var#This} # 从开头删除最短匹配的字符 isis test string[root@localhost init.d]# echo ${var##This} # 从开头删除最长匹配的字符 isis test string[root@localhost init.d]# echo ${var%g} # 从结尾删除最短匹配的字符 isThis is test strin[root@localhost init.d]# echo ${var%%g} # 从结尾删除最长匹配的字符 isThis is test strin[root@localhost init.d]# echo ${var/is/newis} # 替换第一个匹配的字符Thnewis is test string[root@localhost init.d]# echo ${var//is/newis} # 替换所有匹配到的字符Thnewis newis test string[root@localhost init.d]# echo $centos # 变量未定义[root@localhost init.d]# echo ${centos:-UNDEFINE} # 变量为空,返回UNDEFINEUNDEFINE[root@localhost init.d]# centos="CentOS"[root@localhost init.d]# echo ${centos:-UNDEFINE} # 变量已经定义,返回变量本身的值CentOS[root@localhost init.d]# unset centos # 取消变量值[root@localhost init.d]# echo $centos[root@localhost init.d]# result=${centos:=UNDEFINE}[root@localhost init.d]# echo $resultUNDEFINE[root@localhost init.d]# echo $centos # 变量值为空,则将UNDEFINE赋值给centosUNDEFINE[root@localhost init.d]# unset centos[root@localhost init.d]# echo ${centos:?can not find variable centos}-bash: centos: can not find variable centos # 变量值为空,输出自定义错误信息[root@localhost init.d]# centos="IS DEFINED"[root@localhost init.d]# echo ${centos:?can not find variable centos}IS DEFINED  #变量值已定义,则输出变量值[root@localhost init.d]# unset centos[root@localhost init.d]# echo ${centos:+do nothing} # 变量值为空,什么都不操作输出[root@localhost init.d]# centos="do"[root@localhost init.d]# echo ${centos:+do nothing} # 变量已赋值,则输出自定义的消息do nothing

上述内容就是怎么在Shell中实现特殊变量和扩展变量,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

怎么在Shell中实现特殊变量和扩展变量

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

怎么在Shell中实现特殊变量和扩展变量

本篇文章为大家展示了怎么在Shell中实现特殊变量和扩展变量,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。特殊变量在Shell中的特殊变量主要分别两种位置参数变量、状态变量两种。位置参数变量Shel
2023-06-09

Shell编程之特殊变量和扩展变量详解

特殊变量在Shell中的特殊变量主要分别两种位置参数变量、状态变量两种。 位置参数变量Shell中的位置参数变量主要是指0、0、1、$#等,主要用于从命令行、函数或脚本执行等地方传递参数。详细说明如下所示:$0:获取当前执行的Shell脚本
2022-06-04

怎么在shell中使用变量

怎么在shell中使用变量?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。变量删除和替换案例:从头开始匹配,将符合最短的数据删除 (#)variable_1="I
2023-06-09

Shell脚本中的位置变量参数(特殊字符)实例讲解

$# : 传递到脚本的参数个数 $* : 以一个单字符串显示所有向脚本传递的参数。与位置变量不同,此选项参数可超过 9个 $$ : 脚本运行的当前进程 ID号 $! : 后台运行的最后一个进程的进程 ID号 $@ : 与$#相同,但是使用时
2022-06-04

VB.NET中怎么实现变量声明

VB.NET中怎么实现变量声明,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。用户可以使用一般的声明的描述来声明一个对象变量,但是必须把VB.NET变量声明为Object或者
2023-06-17

Linux内核中怎么实现Percpu变量

这篇文章给大家介绍Linux内核中怎么实现Percpu变量,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。所谓thread local变量,就是对于同一个变量,每个线程都有自己的一份,对该变量的访问是线程隔离的,它们之
2023-06-15

Python中怎么实现函数的局部变量

本篇文章给大家分享的是有关Python中怎么实现函数的局部变量,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。局部变量当你在函数定义内声明变量的时候,它们与函数外具有相同名称的其
2023-06-17

怎么在C语言中引用C++的函数和变量

本篇内容主要讲解“怎么在C语言中引用C++的函数和变量”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么在C语言中引用C++的函数和变量”吧!引用C++语言的头文件需添加extern "C",但
2023-06-17

Linq中怎么实现隐式类型化局部变量

本篇文章为大家展示了Linq中怎么实现隐式类型化局部变量,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Linq隐式类型化局部变量还有另一种语言功能被称为Linq隐式类型化局部变量(或简称为 var)
2023-06-17

java中怎么用注解实现变量参数传递

在Java中,可以使用注解来实现变量参数传递的方式是通过自定义注解和反射机制来实现。下面是一个示例代码:首先定义一个自定义注解,用于标记需要传递的参数:import java.lang.annotation.ElementType;imp
java中怎么用注解实现变量参数传递
2024-03-12

怎么在linux中使用shell脚本对未定义变量进行判断

今天就跟大家聊聊有关怎么在linux中使用shell脚本对未定义变量进行判断,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。环境操作系统:win10虚拟机:centos7需求①先查询之
2023-06-09

怎么使用PyTorch和LSTM实现单变量时间序列预测

这篇“怎么使用PyTorch和LSTM实现单变量时间序列预测”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么使用PyTor
2023-07-05

怎么在R语言中对变量进行重编码和重命名

这篇文章给大家介绍怎么在R语言中对变量进行重编码和重命名,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1、变量重编码重编码涉及根据同一个变量和/或其他变量的现有值创建新值的过程,如将符合某个条件的值重新赋值等,这里主要
2023-06-14

怎么在R语言项目中实现一个向量和矩阵

这期内容当中小编将会给大家带来有关怎么在R语言项目中实现一个向量和矩阵,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一、向量运算向量是有相同基本类型的元素序列,一维数组,定义向量的最常用办法是使用函数c(
2023-06-08

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录