shell-特殊位置变量

devtools/2025/1/23 17:15:58/

目录

1.特殊位置变量 $n

2.特殊位置变量 $0

3.特殊位置变量$ #

4.特殊位置变量$*/$@

4.1 $*

4.2 $@

5.shift 命令


1.特殊位置变量 $n

$n:表示传递给脚本或函数的第 n 个参数。

  • $1:第一个参数
  • $2:第二个参数
  • ...
  • $9:第九个参数
  • 超过 9 个参数时,需要用 {},例如 ${10} 表示第十个参数。

2.特殊位置变量 $0

 $0:表示脚本的文件名或当前命令的名称或者脚本路径

bash">#!/bin/bash
echo "脚本名是:$0"
#bash myscript.sh
#脚本名是:myscript.sh

$0获取脚本路径

bash">#!/bin/bash# 使用 dirname 提取脚本目录
script_dir=$(dirname "$0")# 输出脚本目录
echo "脚本目录是:$script_dir"

dirname $0 的作用:

  • 提取 $0 表示的脚本路径中的目录部分。
  • 当使用相对路径调用脚本时,dirname $0 的结果也是相对路径
  • 相对路径:如果你通过相对路径调用脚本,比如 ./script.sh,那么 dirname "$0" 会返回 .,表示当前目录。
  • 绝对路径:如果通过绝对路径调用脚本,dirname "$0" 会返回脚本所在的绝对目录。

basename $0作用:

  • 提取路径中的文件名部分。
  • $0 的值中移除路径部分,只返回文件名。
bash">#!/bin/bash# 获取脚本的完整路径
#script_path=$(readlink -f "$0")# 提取目录和名称
script_dir=$(dirname "$0")
script_name=$(basename "$0")echo "脚本目录是:$script_dir"
echo "脚本名称是:$script_name"

3.特殊位置变量$ #

$# 表示传递给脚本的参数数量,即位置参数的个数。

bash">#!/bin/bash
echo "传递给脚本的参数个数是:$#"
#bash script.sh 1 2 3
#传递给脚本的参数个数是:3
#bash script.sh "1 2" 3
#传递给脚本的参数个数是:2
#bash script.sh {a..z}
#传递给脚本的参数个数是:26

4.特殊位置变量$*/$@

  • $*:将所有参数视为一个单一的字符串。
  • $@:将每个参数视为独立的字符串,特别是当参数包含空格时,区别更加明显。

4.1 $*

  • $* 将所有传递给脚本的参数视为一个单一的字符串,并且各个参数之间会用空格分隔。
  • 没有双引号时,$* 会将所有参数当作一个单一的字符串处理,但它会按照空格拆分参数
bash">#!/bin/bash
echo "使用 \$* 时:"
for i in $*; doecho "[$i]"
donebash test.sh "Hello world" arg2 "this is" arg4$* 会将所有参数当作一个单一的字符串处理,但它会按照空格拆分参数。因此,"Hello world" 被拆成了 Hello 和 world,"this is" 被拆成了 this 和 is。
使用 $* 时:
[Hello]
[world]
[arg2]
[this]
[is]
[arg4]
  • 加上双引号时,"$*" 会把所有的参数当成一个整体,但依然会将参数之间用一个空格隔开。
bash">#!/bin/bash
echo "使用 \"\$*\" 时:"
for i in "$*"; doecho "[$i]"
done使用 "$*" 时:
[Hello world arg2 this is arg4]当加上双引号时,"$*" 将所有参数当作一个完整的单一字符串来处理,并用空格分隔。这样,整个输入变成了一个大字符串 Hello world arg2 this is arg4。

4.2 $@

$@ 也表示所有传递给脚本的参数,但它会将每个参数作为一个独立的字符串,尤其是当参数包含空格时,会将每个参数保留为单独的字符串。

  • 没有双引号时,$@ 会和 $* 相似地将每个参数当作一个独立的部分,参数之间也会用空格分隔。与$*不加双引号行为相同
bash">#!/bin/bash
echo "使用 \$@ 时:"
for i in $@; doecho "[$i]"
done#输出
使用 $@ 时:[Hello]
[world]
[arg2]
[this]
[is]
[arg4]
  • 加上双引号时,"$@" 会让每个参数保持独立,即使参数中有空格,也不会被拆开。
bash">#!/bin/bash
echo "使用 \"\$@\" 时:"
for i in "$@"; doecho "[$i]"
done使用 "$@" 时:
[Hello world]
[arg2]
[this is]
[arg4]当加上双引号时,"$@" 会保留每个参数作为独立的字符串。即使参数中包含空格(如 "Hello world"),它也会将整个 "Hello world" 作为一个参数处理,不会拆分。每个参数都保持独立性。

5.shift 命令

shift 用来将位置参数向左移动,参数的数量会减少,原来的 $1 会被移除,新的 $2 变成 $1,依此类推。

bash">#!/bin/bash# 打印所有传递的参数
echo "原始参数:$@"# 移动参数
shift# 打印移位后的参数
echo "移位后的参数:$@"

可以使用 shift 多次,以进一步移动参数:

bash">#!/bin/bash
shift 2
echo "移位两次后的参数:$@"bash script.sh arg1 arg2 arg3 arg4


http://www.ppmy.cn/devtools/152938.html

相关文章

chrome游览器JSON Formatter插件无效问题排查,FastJsonHttpMessageConverter导致Content-Type返回不正确

问题描述 chrome游览器又一款JSON插件叫JSON Formatter,游览器GET请求调用接口时,如果返回的数据是json格式,则会自动格式化展示,类似这样: 但是今天突然发现怎么也格式化不了,打开一个json文件倒是可以格…

微信小程序使用上拉加载onReachBottom。页面拖不动。一直无法触发上拉的事件。

1,可能是原因是你使用了scroll-view的标签,用onReachBottom触发加载事件。这两个是有冲突的。没办法一起使用。如果页面的样式是滚动的是无法去触发页面的onReachBottom的函数的。因此,你使用overflow:auto.来使用页面的某些元素滚动&#xf…

Spring源码04 - AOP深入设计原理

AOP深入设计原理 文章目录 AOP深入设计原理一:JVM下的AOP1:Java程序运行在JVM中的特征2:Java程序执行流3:引入了代理模式的Java程序执行流 二:Spring AOP工作原理 本文整理自csdn博主亦山 -> 《Spring设计思想》AOP…

每日一题——二分法求旋转数组的最小数字

二分法求旋转数组的最小数字 描述数据范围:要求: 示例示例 1示例 2 解题思路算法流程 代码实现关键点解释举例分析示例 1:[3, 4, 5, 1, 2]示例 2:[3, 100, 200, 3] 总结 描述 有一个长度为 n 的非降序数组,例如 [1, 2…

考研408笔记之数据结构(三)——串

数据结构(三)——串 1. 串的定义和基本操作 本节内容很少,重点是串的模式匹配,所以对于串的定义和基本操作,我就简单提一些易错点。另外,串也是一种特殊的线性表,只不过线性表是可以存储任何东…

RK3568笔记七十六:使用V4L2框架录制MP4视频保存到本地

若该文为原创文章,转载请注明原文出处。 录制MP4使用的是ffmpeg,如何编译自行处理。 使用的是正点原子的RK3568测试,其他板子自行调试。 一、程序功能介绍 说明: 程序参考FFMPEG提供的例子程序muxing.c进行修改。 功能介绍: 程序里目前有一个子线程和一个主线程,子线程…

SSM项目本地Tomcat部署

目录 1、打包 2、部署在本地Tomcat上 3、运行tomcat(startup) 1、打包 在生命周期中,完成打包。 注意:打包时会测试,测试时可能会测试根据id删除。第二次的测试就会出错,导致打包失败。 从target目录下…

【趣学SQL】第三章:数据处理与管理 3.1数据清洗技术——给数据库做“数据SPA“的魔幻之旅

第三章:数据处理与管理 3.1 数据清洗技术——给数据库做"数据SPA"的魔幻之旅 欢迎来到「数据库美容院」!今天我们将化身"数据美容师",用一家虚拟网红餐厅的翻车案例,教你如何把脏乱差的原始数据变成清爽整洁…