shell的特殊重要内置变量

本文详细介绍了Shell脚本中常用的位置变量、进程状态变量及特殊变量的功能与应用场景,包括$0、$n、$#、$*、$@、$?、$!、$$和$_等,并通过实例演示如何正确使用这些变量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

《1》位置变量

$0 获取当前执行的shell脚本的文件名,如果执行脚本带路径,那么就包括脚本路径。

$n 获取当前执行shell的命令行的第n个参数,当n=0时表示脚本的文件名,如果n>9,用{}将其括起来,参数以空格隔开。

$# 获取当前执行的shell脚本后面接的参数的总个数。

[root@localhost SHELL]# vim test.sh 
[root@localhost SHELL]# sh test.sh "how are you" hello
how are you hello 2 test.sh
[root@localhost SHELL]# cat test.sh 
echo $1 $2 $# $0
[root@localhost SHELL]# 

///////////////////加引号与否
[root@localhost SHELL]# vim test.sh 
[root@localhost SHELL]# sh test.sh how are you
how are
[root@localhost SHELL]# sh test.sh "how are you" hello
how are you hello
[root@localhost SHELL]# cat test.sh 
echo $1 $2

$*
$@

$@ 与 $* 的区别:
$* 将命令行的所有参数视为一个单独的字符串,等同于”$1$2$3”,”$*”

$@ 将命令行的每个参数视为单独的字符串,等同于”$1”, “$2”, “$3”.

dirname 与 basename

dirname 获取文件的路径名
basename 获取文件的名称

[root@localhost SHELL]# dirname /root/Desktop/SHELL/test.sh 
/root/Desktop/SHELL
[root@localhost SHELL]# basename /root/Desktop/SHELL/test.sh 
test.sh
[root@localhost SHELL]# 

$0的使用验证
这里写图片描述

《2》进程状态变量

$? 获取执行上一个指令的返回值(0表示成功,非0表示失败)

[root@localhost SHELL]# echo $?
0
[root@localhost SHELL]# sh test1.sh 
ni hao, ming tian
[root@localhost SHELL]# echo $?
0
[root@localhost SHELL]# cat test1.sh 
echo 'ni hao, ming tian'
[root@localhost SHELL]# 

$? 的返回值的意义:

0 执行成功
2 权限不够
1~125 执行失败
126 找到该命令了,但是无法执行
127 未找到要运行的命令
大于128 命令被系统强制中断

提示: 在脚本中一般用 exit 数字,在执行脚本后,返回返回值给$?;;;; 在函数里用return 数字 返回返回值给$?

$! 获取执行上一个指令的PID
$$ 获取当前shell的进程号(PID)

[root@localhost SHELL]# sh test1.sh 
ni hao, ming tian
[root@localhost SHELL]# echo $$
5964
[root@localhost SHELL]# cat test1.sh 
echo 'ni hao, ming tian'
[root@localhost SHELL]# 

/////////////////
[root@localhost SHELL]# vim test.sh 
[root@localhost SHELL]# sh test.sh &
[2] 7733
[root@localhost SHELL]# cat /tmp/a.pid 
7733
[root@localhost SHELL]# cat test.sh 
echo $$ >/tmp/a.pid
sleep 200
[root@localhost SHELL]# 

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

[root@localhost SHELL]# ls ./
test1.sh  test.sh  UNIX.shell范例精解(第4版).pdf
[root@localhost SHELL]# echo $_
./
[root@localhost SHELL]# 

//////////////////
[root@localhost SHELL]# cat test.sh 
echo $1 $2 $# $0
[root@localhost SHELL]# echo $_
test.sh
[root@localhost SHELL]# sh test.sh hello world
hello world 2 test.sh
[root@localhost SHELL]# echo $_
world
[root@localhost SHELL]# 
### 关于 Shell 脚本中的内置变量Shell 脚本编程中,内置变量是一些由 Shell 自动定义并维护的特殊变量。这些变量通常用于获取有关脚本运行状态的信息或者控制脚本的行为。以下是常见的内置变量及其用途: #### 1. `$0` 表示当前正在执行的脚本文件名。它可以帮助我们了解脚本是如何被调用的。例如,在以下场景中可以使用: ```bash #!/bin/bash echo "The script name is: $0" ``` 如果运行 `./example.sh`,则会输出 `The script name is: ./example.sh`[^3]。 --- #### 2. `$n` (其中 n 是正整数) 这是位置参数变量,用于访问传递给脚本的命令行参数。具体来说: - `$1`, `$2`, ..., `$9` 表示第一个到第九个命令行参数。 - 如果超过九个参数,则需要用大括号 `{}` 来引用,比如 `${10}`, `${11}` 等。 下面是一个简单的例子: ```bash #!/bin/bash echo "First argument: $1" echo "Second argument: $2" echo "Third argument: ${10}" # 使用大括号来引用第十个参数 ``` 假设运行如下命令: ```bash ./script.sh hello world this is a test example of positional parameters ten eleven ``` 输出将是: ``` First argument: hello Second argument: world Third argument: ten ``` [^2] --- #### 3. `$#` 表示传入脚本的参数总数。这有助于动态处理不同数量的参数。例如: ```bash #!/bin/bash if [ $# -eq 0 ]; then echo "No arguments supplied." else echo "Number of arguments passed: $#" fi ``` 当运行 `./count_args.sh one two three` 时,输出为 `Number of arguments passed: 3`[^2]。 --- #### 4. `$@` 和 `$*` 这两个变量都用于遍历所有的命令行参数,但在某些情况下行为略有差异: - **`$@`**: 将每个参数视为单独的一个字符串(即使参数中有空格)。 - **`$*`**: 将所有参数作为一个整体字符串对待。 示例代码展示两者的区别: ```bash #!/bin/bash echo "Using \$*: '$*' " echo "Using \$@: '$@' " for arg in "$@"; do echo "- Argument: $arg" done ``` 假如运行 `./args_test.sh first "second part" third`,输出可能如下: ``` Using $*: 'first second part third' Using $@: 'first' 'second part' 'third' - Argument: first - Argument: second part - Argument: third ``` --- #### 5. `$?` 存储最近一个命令或函数退出的状态码。正常结束返回值通常是 `0`,而非零值一般表示错误发生。例如: ```bash #!/bin/bash ls /nonexistent_directory exit_status=$? if [ $exit_status -ne 0 ]; then echo "Command failed with exit code: $exit_status" fi ``` 如果目录 `/nonexistent_directory` 不存在,将会打印类似这样的消息: ``` Command failed with exit code: 2 ``` [^3] --- #### 6. `$$` 保存当前进程 ID(PID),这对于调试或多线程应用非常有用。例如: ```bash #!/bin/bash echo "Process ID of the current shell: $$" sleep 5 & child_pid=$! wait $child_pid echo "Child process ($child_pid) has finished." ``` 此脚本先显示父进程 PID,接着启动子进程等待其完成后再继续[^3]。 --- #### 7. `$!` 记录最后后台进程中创建的新进程编号。可用于监控后台作业情况。例如: ```bash #!/bin/bash nohup sleep 100 & bg_job_id=$! echo "Background job started, its PID is: $!" kill -0 $bg_job_id && echo "Job still running." || echo "Job terminated." ``` 这里展示了如何跟踪以及检查某个后台任务是否仍然存活。 --- ### 总结 以上列举了一些常用的 Shell 内置变量及其典型应用场景。合理运用这些工具可以让我们的脚本更加强大且易于管理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值