shell特殊位置变量的问题小结

 更新时间:2025年01月21日 10:25:58   作者:躺不平的理查德  
这篇文章介绍了一些在Shell脚本中常用的特殊位置变量,如$n, $0, $#等,并详细解释了它们的功能和用法,感兴趣的朋友跟随小编一起看看吧

1.特殊位置变量 $n

  • $n:表示传递给脚本或函数的第 n 个参数。
  • $1:第一个参数
  • $2:第二个参数
  • ...
  • $9:第九个参数
  • 超过 9 个参数时,需要用 {},例如 ${10} 表示第十个参数。

2.特殊位置变量 $0

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

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

$0获取脚本路径

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

dirname $0 的作用:

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

basename $0作用:

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

3.特殊位置变量$ #

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

#!/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 $*

  • $* 将所有传递给脚本的参数视为一个单一的字符串,并且各个参数之间会用空格分隔。
  • 没有双引号时,$* 会将所有参数当作一个单一的字符串处理,但它会按照空格拆分参数
#!/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]

加上双引号时,"$*" 会把所有的参数当成一个整体,但依然会将参数之间用一个空格隔开。

#!/bin/bash
echo "使用 \"\$*\" 时:"
for i in "$*"; do
  echo "[$i]"
done
使用 "$*" 时:
[Hello world arg2 this is arg4]
当加上双引号时,"$*" 将所有参数当作一个完整的单一字符串来处理,并用空格分隔。这样,整个输入变成了一个大字符串 Hello world arg2 this is arg4。

4.2 $@

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

没有双引号时,$@ 会和 $* 相似地将每个参数当作一个独立的部分,参数之间也会用空格分隔。与$*不加双引号行为相同

#!/bin/bash
echo "使用 \$@ 时:"
for i in $@; do
  echo "[$i]"
done
#输出
使用 $@ 时:
[Hello]
[world]
[arg2]
[this]
[is]
[arg4]

加上双引号时,"$@" 会让每个参数保持独立,即使参数中有空格,也不会被拆开。

#!/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,依此类推。

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

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

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

到此这篇关于shell特殊位置变量的文章就介绍到这了,更多相关shell特殊位置变量内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Shell脚本的条件测试和if条件语句使用方法

    Shell脚本的条件测试和if条件语句使用方法

    这篇文章主要介绍了Shell脚本的条件测试和if条件语句使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11
  • shell 字符串操作(长度,查找,替换)详解

    shell 字符串操作(长度,查找,替换)详解

    在做shell批处理程序时候,经常会涉及到字符串相关操作。有很多命令语句,如:awk,sed都可以做字符串各种操作。其实shell内置一系列操作符号,可以达到类似效果,大家知道,使用内部操作符会省略启动外部程序等时间,因此速度会非常的快
    2012-09-09
  • Linux启动过程详细介绍

    Linux启动过程详细介绍

    这篇文章主要介绍了Linux启动过程详细介绍的相关资料,需要的朋友可以参考下
    2017-06-06
  • Shell中的循环语句for、while、until实例讲解

    Shell中的循环语句for、while、until实例讲解

    这篇文章主要介绍了Shell中的循环语句for、while、until实例讲解,简单清晰明了,非常不错的教程,需要的朋友可以参考下
    2014-06-06
  • linux启动级别的含义(init 0-6)

    linux启动级别的含义(init 0-6)

    这篇文章主要介绍了linux启动级别的含义(init 0-6),需要的朋友可以参考下
    2014-02-02
  • linux 查看端口占用命令实例详解

    linux 查看端口占用命令实例详解

    这篇文章主要介绍了 linux 查看端口占用命令实例详解的相关资料,教大家怎样查看系统端口占用情况,需要的朋友可以参考下
    2017-07-07
  • Linux下的fdisk指令用法场景分析

    Linux下的fdisk指令用法场景分析

    在Linux系统中,对磁盘进行分区是管理和利用磁盘空间的重要任务之一,本篇将以通俗易懂的方式,详细介绍fdisk指令的前世今生、功能、用法和应用场景,帮助读者全面了解fdisk指令,并掌握其在磁盘管理和问题排查方面的应用,需要的朋友可以参考下
    2024-01-01
  • linux系统下用.sh文件执行python命令的方法

    linux系统下用.sh文件执行python命令的方法

    这篇文章主要给大家介绍了关于linux系统下用.sh文件执行python命令的相关资料,文中通过实例代码介绍的非常详细,对大家学习或者使用python具有一定的参考学习价值,需要的朋友可以参考下
    2022-07-07
  • linux 中grep 匹配制表符 和 换行符的命令

    linux 中grep 匹配制表符 和 换行符的命令

    这篇文章主要介绍了linux 中grep 匹配制表符 和 换行符的命令,需要的朋友可以参考下
    2018-07-07
  • 使用Systemctl列出Linux中所有服务的操作步骤

    使用Systemctl列出Linux中所有服务的操作步骤

    在 Linux 系统中,Systemctl 是一个强大的工具,用于管理系统的服务和守护进程,它可以让用户轻松地启动、停止、重启以及管理各种系统服务,本文将详细介绍如何使用 Systemctl 来列出 Linux 中的所有服务,需要的朋友可以参考下
    2024-05-05

最新评论