Shell 特殊变量详解

Shell 提供了一系列特殊变量,它们在脚本编程中非常有用。这些变量由 Shell 自动设置,用于访问脚本参数、进程信息等。

基本特殊变量

1. 位置参数变量

变量 描述
$0 当前脚本的文件名
$1 - $9 脚本的第1到第9个参数
${10} - ${n} 第10个及以后的参数

示例:

#!/bin/bash
echo "脚本名称: $0"
echo "第一个参数: $1"
echo "第二个参数: $2"

2. 参数相关变量

变量 描述
$# 传递给脚本的参数个数
$* 所有位置参数作为一个字符串
$@ 所有位置参数作为独立的字符串
$_ 上一个命令的最后一个参数

示例:

#!/bin/bash
echo "参数总数: $#"
echo "所有参数: $*"
echo "所有参数: $@"

$*$@ 的区别

$* 将所有参数视为一个整体字符串
$@ 将每个参数视为独立的字符串

在双引号中使用时的区别:

for arg in "$*"; do echo "[$arg]"; done  # 所有参数在一个字符串中
for arg in "$@"; do echo "[$arg]"; done  # 每个参数单独处理

进程相关变量

变量 描述
$$ 当前Shell进程的PID
$! 最后一个后台进程的PID
$PPID 父进程的PID

示例:

echo "当前进程ID: $$"
echo "父进程ID: $PPID"
sleep 10 &
echo "后台进程ID: $!"

状态变量

变量 描述
$? 上一个命令的退出状态
$RANDOM 返回一个随机数 (0-32767)
$SECONDS 脚本已运行的秒数

示例:

ls /nonexistent
echo "上条命令退出状态: $?"

echo "随机数: $RANDOM"
echo "脚本已运行: $SECONDS 秒"

IFS (内部字段分隔符)

IFS 决定了Shell如何分割单词,默认值为空格、制表符和换行符。

示例:

IFS=:
path="/usr/bin:/usr/local/bin:/bin"
for dir in $path; do
    echo "目录: $dir"
done

其他有用变量

变量 描述
$LINENO 当前行号
$FUNCNAME 当前函数名
$BASH_VERSION Bash版本
$HOSTNAME 主机名
$PWD 当前工作目录
$OLDPWD 上一个工作目录

示例:

echo "当前行号: $LINENO"
echo "主机名: $HOSTNAME"
echo "当前目录: $PWD"

特殊参数

参数 描述
$- 当前Shell的选项标志
$ 当前Shell的PID (同 $$)
! 最近后台进程的PID (同 $!)

使用技巧

  1. 检查参数是否提供:
if [ $# -eq 0 ]; then
    echo "用法: $0 参数1 参数2..."
    exit 1
fi
  1. 遍历所有参数:
for arg in "$@"; do
    echo "参数: $arg"
done
  1. 获取脚本所在目录:
SCRIPT_DIR=$(dirname "$0")
echo "脚本目录: $SCRIPT_DIR"
  1. 检查命令是否成功:
grep "pattern" file.txt
if [ $? -ne 0 ]; then
    echo "未找到匹配项"
fi

这些特殊变量使得Shell脚本能够灵活地处理参数、进程和环境信息,是Shell编程中不可或缺的部分。

你可能感兴趣的:(shell,linux,前端,linux)