首页 / Linux 命令行入门教程 / 82. 位置参数与特殊变量

Linux 命令行入门教程

82. 位置参数与特殊变量

本教程共 90 篇 · 第 82 篇

82. 位置参数与特殊变量

上一章的脚本变量都是写死的。真实脚本要能接收你传进去的参数,这就需要位置参数。

位置参数

运行脚本时跟在后面的词,按顺序叫 $1$2$3…… 脚本名字本身是 $0

./greet.sh 小明 18

greet.sh 里,$0./greet.sh$1小明$218

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

$@ 表示”全部参数”,$# 表示”参数个数”。判断用户有没有传够参数时很有用:

#!/bin/bash
echo "一共收到 $# 个参数"
echo "全部参数是:$@"
Tip

想给参数设默认值,可以写成 ${1:-默认值}。当 $1 为空时自动用默认值,脚本更健壮。

特殊变量

除了位置参数,bash 还内置几个”只读”的特殊变量,帮你掌握脚本运行状态:

变量含义
$?上一条命令的退出码,0 表示成功
$$当前脚本的进程号(PID)
$!后台运行的最后一个进程号

上面三个才是 bash 内置的”特殊变量”(只读)。$0 脚本名和 $# 参数个数属于位置参数,已在上一节讲过,这里不再重复。

最常用的是 $?。每条命令执行完都会留下一个退出码:成功是 0,失败是非 0。用它能判断上一步成没成功:

#!/bin/bash
mkdir /tmp/demo
if [ $? -eq 0 ]; then
  echo "目录创建成功"
else
  echo "创建失败"
fi

$$ 在写临时文件时常用来避免重名,比如 /tmp/tmp.$$

实战小例

一个带参数个数检查的问候脚本:

#!/bin/bash
if [ $# -lt 1 ]; then
  echo "用法:$0 你的名字"
  exit 1
fi
echo "你好,$1!"

exit 1 表示脚本以”失败”状态退出,方便被别的脚本判断是否执行成功。

小结:位置参数 $1/$@/$# 接收外部输入,$?/$$/$! 反映运行状态。下一章看变量还能玩出什么花样。