LINUX Shell命令中$0、$1-9、$#、$?、$*、$@、$!、$、$-、$IFS含义及举例

在Linux Shell脚本中,预定义了一些特殊参数,它们分别代表不同的含义和返回值,下面试着借用ChatGTP辅助写作进行总结并举例:

1. $0:脚本名

$0返回当前值行的shell脚本的名称。

2.$1-$9:命令行参数1到9

$1-$9这9个分别代表脚本执行命令第一个参数、第二个参数、第三个参数……第9个参数。

例如,假设我们有一个名为 test.sh 的Shell脚本,它的内容如下:

#!/bin/bashecho "Script name: $0"
echo "First argument: $1"
echo "Second argument: $2"

在运行脚本时,我们可以给它传递两个参数,比如:

./test.sh hello world

这时候脚本会输出:

Script name: test.sh
First argument: hello
Second argument: world

说明 代表脚本名,1 代表第一个参数,$2代表第二个参数。

3. $#: 参数个数

它表示所有参数的个数。

#!/bin/bashecho "Number of arguments: $#"

运行脚本 ./test.sh hello world,输出 Number of arguments: 2

4. $*: 所有参数

$*表示所有参数。

#!/bin/bashecho "All arguments: $*"

运行脚本 ./test.sh hello world,输出 All arguments: hello world

5. $@: 所有参数

$@也表示所有参数,

#!/bin/bashecho "All arguments: $@"

运行脚本 ./test.sh hello world,输出 All arguments: hello world

上面$*和$@都是用来获取所有脚本参数的特殊变量。它们之间的区别在于,如何将参数作为单个字符串或多个独立字符串进行处理。

  • $*会把所有的参数解释成一个单词(单个字符串),即每个参数之间不会加上空格,全部组合成一个字符串,用"IFS"(默认是空格)分隔。所以,将*放在双引号里,预处理$符号,保持长字符串的完整性:
#!/bin/bashecho "Using \$*:"
for arg in "$*"; doecho $arg
done
  • $@会把所有的参数看成是独立的单词(多个独立的字符串),即每个参数之间加上空格,将每个参数作为一个独立的字符串处理。
#!/bin/bashecho "Using \$@:"
for arg in "$@"; doecho $arg
done

下面我们可以通过一个示例来理解两者的区别。假设我们有一个shell脚本,名为 test.sh 并拥有以下内容:

#!/bin/bashecho "Using \$*:"
for arg in "$*"; doecho $arg
doneecho "Using \$@:"
for arg in "$@"; doecho $arg
done

然后,在终端上执行以下命令:

$ ./test.sh one two three

当我们执行脚本时,输出如下所示:

Using $*:
one two three
Using $@:
one
two
three

我们可以看到,使用时,所有参数都解释为单个字符串,由空格分隔。而使用@时,每个参数都被解释为一个单独的字符串,并独立处理。在大多数情况下,使用$@是更加灵活和安全的选项,因为它可以独立处理每个参数,而不会将它们合并为单个字符串。

6. $?: 上一个命令的退出状态码
#!/bin/bashls /
echo "Exit status code: $?"

由于ls /应该会执行成功,因此运行脚本后输出 Exit status code: 0,表示上一个命令执行成功。

7. $$:当前进程ID

$$是一个特殊的变量,用于获取当前正在运行的Shell脚本的进程ID(PID)

这个变量对于在Shell脚本中跟踪和识别进程非常有用,或者将PID用于生成唯一的临时文件名。

以下是一个简单的示例脚本,它使用$$变量来创建一个唯一的临时文件名:

#!/bin/bashtempfile=/tmp/myprog.$$echo "Program is running with PID $$."
echo "Temp filename is $tempfile."#rest of the script goes here...

在上述示例中,我们使用了$$变量来创建一个唯一的文件名,将其存储在$tempfile变量中,并在控制台输出当前脚本运行的进程ID。这个唯一的文件名将被用于存储程序输出或其他的过程。

使用$$变量时,需要注意它只能获取当前Shell脚本的PID而不能获取任何子进程或后台任务的PID

8. $!:最近一次在后台运行的进程的PID号

在Linux Shell脚本中,!是一个特殊变量,用于获取最近一次在后台运行的进程的PID号(进程ID号)。! 通常用于在脚本中启动后台进程,并且需要获取后台进程的PID号。

以下是一个示例脚本 test.sh,它使用&运算符来将程序启动到后台运行,并使用$!变量获取需要的PID号:

#!/bin/bashecho "Starting background process..."
sleep 5 &
background_pid=$!
echo "The background process PID is: $background_pid"

上述脚本中的sleep命令会在后台执行5秒钟,并执行$!将其PID号赋值给变量background_pid。最后,脚本会输出后台进程的PID号。

执行该脚本的命令是:./test.sh,其输出如下:

Starting background process...
The background process PID is: 12345

其中,12345应该是实际执行中sleep进程的PID号,其值随机。

9. $-:获取当前Shell的选项标志

$-是一个特殊变量,用于获取当前Shell的选项标志(Option Flags)。选项标志是Shell用来控制其行为的一些特殊设置。

$-可以用来获取当前Shell所使用的选项标志,通常应用于Shell脚本的调试中,可以帮助我们诊断问题。

以下是一个示例脚本 test.sh,它使用$-变量获取当前Shell的选项标志及其含义:

#!/bin/bashecho "Value of \$-: $-"

上述脚本中,echo命令会输出当前Shell的选项标志。

执行该脚本的命令是:./test.sh,其输出如下:

Value of $-: himBH

上述输出中,选项标志中包含了5个字符,分别表示以下内容:

  • h:bash shell启用hash命令时将完成命令名和缓存条目之间的HASH值打印到标准错误输出中;
  • i:交互模式运行,即标准输入与终端相连;
  • m:启用作业控制功能;
  • B:启用Brace Expansion(花括号扩展)机制;
  • H:Shell扩展历史记录功能,寻找法:$HOME/.bash_history,如果该文件不存在则新建一个。
10. $IFS:指定Shell脚本中的字段分隔符

$IFS是一个特殊变量,用于指定Shell脚本中的字段分隔符。字段分隔符是将一行输入或输出按照不同的字段拆分开来并存储在不同的变量中的标记。

默认情况下,$IFS的值为空格,制表符和换行符。但是,我们可以将其设置为其他的分隔符来满足特定的需求。

以下是一个示例脚本 test.sh,它使用$IFS变量来指定不同的分隔符,将一行输入按照分隔符分成不同的变量:

#!/bin/bashecho "Enter a line of values separated by commas (','):"
read lineecho "Default IFS values: '$IFS'"
IFS=","
echo "Custom IFS value set to: '$IFS'"echo "Values entered:"
for value in $line
doecho "$value"
done

上述脚本中,通过read命令读取一行输入,并通过将$IFS设置为逗号来将输入行分隔成不同的变量。最后,使用for循环按顺序输出不同的变量。

执行该脚本的命令是:./test.sh,它会提示用户输入一个以逗号分隔的值列表。然后,它将逗号设置为分隔符并按顺序输出每个值。下面是一些示例输入和输出:

输入:

a,b,c,d,e

输出:

Default IFS values: '  \n'
Custom IFS value set to: ','
Values entered:
a
b
c
d
e

在上述输出中,$IFS的初始值为默认值(空格、制表符、换行符),该输入字符串以逗号分隔,然后按逗号分隔的方式打印每个值。

这是一个非常有用的用法,可以将一行以逗号或其他字符分隔的值按分隔符分成不同的变量,进一步处理这些变量值。

关于shell中这10个特殊变量,总结如下:

特殊变量功能
$0当前执行的Shell脚本的文件名
$1-$9当前Shell脚本的参数1-9
$#当前Shell脚本的参数数量
$?上一次执行的命令的退出状态
$*所有当前Shell脚本的参数,作为一个单独的字符串
$@所有当前Shell脚本的参数,作为多个独立的字符串
$!上一次在后台运行的任务的进程ID
$$当前Shell脚本的进程ID
$-当前Shell使用的选项(标志)
$IFSShell脚本中用于指定字段分隔符的值

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/884203.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024年meme币走势分析:最后两个月的市场趋势与机会 #交易所#dapp#KOL社区合作

2024年即将步入尾声,meme币市场经历了显著的波动。对于加密市场来说,年底的走势尤为关键,尤其是meme币这种受市场情绪影响较大的加密资产。本文将从市场环境、宏观经济因素、投资者情绪、技术分析等方面分析meme币在2024年最后两个月的潜在走…

python读取视频并转换成gif图片

1. 安装三方库 moviepy 将视频转换成gif,需要使用 moviepy库 确保已经安装了moviepy库 pip install moviepy2. 代码实现: from moviepy.editor import VideoFileClipmyclip VideoFileClip("video.mp4") myclip2 myclip.subclip(0, 10).re…

opencv - py_imgproc - py_filtering filtering 过滤-卷积平滑

文章目录 平滑图像目标2D 卷积(图像过滤)图像模糊(图像平滑)1. 平均2. 高斯模糊3. 中值模糊4. 双边滤波 其他资源 平滑图像 目标 学习: 使用各种低通滤波器模糊图像将定制滤波器应用于图像(2D 卷积&…

大数据新视界 -- 大数据大厂之数据质量管理全景洞察:从荆棘挑战到辉煌策略与前沿曙光

💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

如何保护网站安全

1. 使用 Web 应用防火墙(WAF) 功能:WAF 可以实时检测和阻止 SQL 注入、跨站脚本(XSS)、文件包含等常见攻击。它通过分析 HTTP 流量来过滤恶意请求。 推荐:可以使用像 雷池社区版这样的 WAF,它提…

大模型中的token是什么;常见大语言模型的 token 情况

目录 大模型中的token是什么 常见大语言模型的 token 情况 大模型中的token是什么 定义 在大模型中,token 是文本处理的基本单位。它可以是一个字、一个词,或者是其他被模型定义的语言单元。简单来说,模型在理解和生成文本时,不是以完整的句子或段落为单位进行一次性处理…

redis安装使用

1. 下载地址 下载最新稳定版本的 redis-windows 7.x 版本(本实例以 7.2.3 为例) # 下载地址 https://download.csdn.net/download/qq827245563/89923840 2. 解压文件 3. 下载可视化工具 # 下载地址 https://download.csdn.net/download/qq827245563/89940627 4. 启动运行 …

ELK + Spring Boot:日志分析入门与实践(一)

目录 一、安装ELK 1.1 版本选择 1.2 linux环境安装 1.3 ES配置启动 1.4 Kibana配置启动 1.5 Logstash配置启动 二、项目调整 2.1 pom依赖调整 2.2 yml配置文件调整 2.3 logback-spring配置 三、日志查询分析 3.1 创建索引模式 3.2 查询日志数据 一、安装ELK 1.1 …

elasticsearch 8.x 插件安装(六)之Hanlp插件

elasticsearch 8.x 插件安装(六)之Hanlp插件 elasticsearch插件安装合集 elasticsearch插件安装(一)之ik分词器安装(含MySQL更新) elasticsearch 8.x插件(二)之同义词安装如何解决…

vi —— 终端中的编辑器

目标 vi 简介打开和新建文件三种工作模式常用命令分屏命令常用命令速查图 01. vi 简介 1.1 学习 vi 的目的 在工作中,要对 服务器 上的文件进行 简单 的修改,可以使用 ssh 远程登录到服务器上,并且使用 vi 进行快速的编辑即可常见需要修改…

stm32cubeIde 使用笔记

划分flash空间 需要更改STM32xxx_FLASH.ld文件 输出其他格式文件

图片批量处理神器将每个文件夹中的多张图片拼接,一键实现横向和纵向的长图拼接效果,让你的图片处理更高效

是不是经常面对一堆图片文件夹,想要把它们里面的宝贝图片一一拼接起来,却又被繁琐的操作吓得直摇头?别担心,今天我要给大家介绍一位图片处理界的超级英雄——首助编辑高手软件!它就像是一位拥有魔法的图片大师&#xf…

【JVM详解JVM优化】聊聊JVM优化

简介: 前面两期文章讲了JVM内存模型:【JVM详解&JVM优化】JVM内存模型-CSDN博客 以及JVM垃圾回收机制:【JVM详解&JVM优化】JVM垃圾回收机制-CSDN博客 在本篇文章中,我们将深入探讨Java虚拟机(JVM)…

通俗易懂的餐厅例子来讲解JVM

餐厅版本 JVM(Java虚拟机)可以想象成一个虚拟的计算机,它能够运行Java程序。为了让你更容易理解,我们可以用一个餐厅的比喻来解释JVM: 菜单(Java源代码): 想象一下,Java…

一文搞懂各种Attention机制

1.各种Attention 最近在重读Transformer论文的过程中,结合其他看过的资料,对各种Attention概念有进一步的了解。回顾最初刚接触时候的迷糊,觉得有必要写一篇文章记录一下对各种attention新的理解。 2.论文中的Transformer架构图 先上经典的…

Python+Appium+Pytest+Allure自动化测试框架-代码篇

文章目录 自动化测试框架工程目录示例测试代码示例结果查看allurepytest编写pytest测试样例的规则pytest conftest.py向测试函数传参 appium启动appium服务代码端通过端口与appium服务通信对设备进行操作在pytest测试用例中调用appium 更多功能 PythonAppiumPytestAllure自动化…

【C++】红黑树的Iterator改造以及mapset的模拟实现与封装

目录 01.红黑树的迭代器 operator: operator*、-> operator、! 02.红黑树的改造 begin和end方法 keyOfValue insert方法 find方法 size方法 clear方法 03.map&set的模拟实现 01.红黑树的迭代器 前面的博客我们介绍了红黑树的底层原理并手撕了一个自己的红…

微信小程序服务通知

项目中用到了小程序的服务消息通知,通知订单状态信息,下边就是整理的一下代码,放到项目中,把项目的小程序appid和小程序的secret写进去,直接运行即可 提前申请好小程序服务信息通知短信模板,代码需要用到模…

linux命令行的艺术

文章目录 前言基础日常使用文件及数据处理系统调试单行脚本冷门但有用仅限 OS X 系统仅限 Windows 系统在 Windows 下获取 Unix 工具实用 Windows 命令行工具Cygwin 技巧 更多资源免责声明 熟练使用命令行是一种常常被忽视,或被认为难以掌握的技能,但实际…

2024年最新版SSL证书

SSL证书行业变动很大,随着操作系统,浏览器新版本不断增加,对SSL证书兼容性要求越来也高,对于安全性也有所提升,主流CA机构根证书及交叉链迎来了换新,这是为了延续下一个20个年的安全计划的提前不如&#xf…