shell-特殊位置变量

目录

[1.特殊位置变量 n](#1.特殊位置变量 n)

[2.特殊位置变量 0](#2.特殊位置变量 0)

3.特殊位置变量$ #

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

[4.1 \*](#4.1 *)

[4.2 @](#4.2 @)

[5.shift 命令](#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 $*; do
  echo "[$i]"
done

bash 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 "$*"; do
  echo "[$i]"
done


使用 "$*" 时:
[Hello world arg2 this is arg4]

当加上双引号时,"$*" 将所有参数当作一个完整的单一字符串来处理,并用空格分隔。这样,整个输入变成了一个大字符串 Hello world arg2 this is arg4。

4.2 $@

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

  • 没有双引号 时,$@ 会和 $* 相似地将每个参数当作一个独立的部分,参数之间也会用空格分隔。与$*不加双引号行为相同
bash 复制代码
#!/bin/bash
echo "使用 \$@ 时:"
for i in $@; do
  echo "[$i]"
done

#输出
使用 $@ 时:

[Hello]
[world]
[arg2]
[this]
[is]
[arg4]
  • 加上双引号 时,"$@" 会让每个参数保持独立,即使参数中有空格,也不会被拆开。
bash 复制代码
#!/bin/bash
echo "使用 \"\$@\" 时:"
for i in "$@"; do
  echo "[$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
相关推荐
小范的技术工坊1 小时前
Linux应用开发(文件属性)
linux·运维·服务器
wuminyu1 小时前
JMM学习总结:深入理解happens-before关系
java·linux·c语言·jvm·c++
古法老登瞎折腾2 小时前
大数据智能运维实战(一):机器和任务数据都有了,如何用 MCP 搭建运维助手?
大数据·运维·spring boot·spring ai·mcp
开开心心就好2 小时前
多份文档怎么批量打印?支持多种格式
java·服务器·开发语言·pdf·ocr·散列表·启发式算法
海宇数据2 小时前
零信任架构实战:基于海宇入职背调报告构建自动化即时配送与网约车众包运力准入鉴权网关
运维·人工智能·架构·自动化
姜鱼问生2 小时前
每次开机手动检查 6 样东西?我写了个 2 秒自检脚本
运维·网络·nginx·docker·容器
wangqiaowq2 小时前
PostgresSQL server Docker 安装部署
运维·docker·容器
高晶3 小时前
ARM 嵌入式 Linux 文件系统从入门到实战:目录结构、权限管理、选型与挂载排查全攻略
linux·程序员
南棋网络安全3 小时前
ssrf跨站请求伪造(保姆级教程)
运维·服务器·网络·网络安全
运维全世界3 小时前
Slurm集群搭建实战踩坑:存储节点无RAID、跨节点GPU无法读取数据彻底解决
linux