Shell的参数替换

参数替换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/bin/bash

TARGET_IP=${1:-"8.8.8.8"} # 目标IP,默认8.8.8.8
MAX_RETRIES=${2:-0} # 最大重试次数,0表示无限
RETRY_INTERVAL=${3:-1} # 重试间隔(秒)
VERBOSE=${4:-false} # 是否输出详细信息

retries=0

while true; do
if ping -c 1 -W 2 "$TARGET_IP" > /dev/null 2>&1; then
echo "[SUCCESS] Connected to $TARGET_IP"
exit 0
else
$VERBOSE && echo "[INFO] Connection to $TARGET_IP failed. Retrying..."
((retries++))
# 超时检测
if [[ $MAX_RETRIES -gt 0 && $retries -ge $MAX_RETRIES ]]; then
echo "[ERROR] Failed after $MAX_RETRIES attempts. Exiting."
exit 1
fi
sleep "$RETRY_INTERVAL"
fi
done

check_net.sh 代码实现了一个检测网络连接的功能,会持续尝试ping通 8.8.8.8,直到最大尝试重试次数并退出。其中的 TARGET_IP=${1:-"8.8.8.8"} 里,就用到Bash Shell的参数替换功能。

语法结构

1
${参数位置:-默认值}
  • 参数位置:1 表示第一个命令行参数($1)
  • :-:特殊符号,表示”如果前面的变量未设置或值为空”
  • 默认值:当前面的变量不满足条件时使用的值

典型场景

情况1:不传参数

1
2
./check_net.sh
# $1 未定义 → 使用默认值 → TARGET_IP=8.8.8.8

情况2:传入空字符串

1
2
./check_net.sh ""
# $1 是空值 → 使用默认值 → TARGET_IP=8.8.8.8

情况3:传入有效值

1
2
./check_net.sh "192.168.1.1"
# $1 有值 → 使用传入值 → TARGET_IP=192.168.1.1

其他的参数替换

在Shell中,还有其他的参数替换功能可用

语法 触发条件
${变量:-默认值} 变量未定义或值为空
${变量-默认值} 仅变量未定义(允许空值)
${变量:=默认值} 变量未定义时赋值(永久设置)
${变量:?错误信息} 变量未定义/为空时终止脚本,显示错误
${变量: -$(命令)} 变量未定义时使用命令生成

链式默认值

在一个变量没有设置时,有多个变量候选设置,这种情况就可以使用链式默认值

语法:

1
2
# 优先用用户指定值 → 次选环境变量 → 最后用硬编码值
log_level="${1:-${LOG_LEVEL:-info}}"

实际代码:

1
2
3
4
5
6
7
8
9
10
#!/bin/bash

# 变量来源可以是任意途径(参数、环境变量、配置文件等)
INPUT_NAME="$1" # 来自参数
ENV_NAME="$USER" # 来自环境变量
CONFIG_NAME=$(get_config) # 来自某个命令的输出

# 统一使用参数替换处理
display_name="${INPUT_NAME:-${ENV_NAME:-Guest}}"
echo "Welcome, $display_name"
测试命令 输出结果 处理逻辑
./demo.sh Welcome, 当前用户名 参数未传 → 使用环境变量USER→如果USER → 如果USER→如果USER未定义则使用”Guest”
./demo.sh “” Welcome, Guest 参数传空字符串 → 由于变量INPUT_NAME为空 → 触发默认值链式替换
unset USER; ./demo.sh Welcome, Guest 参数未传+环境变量$USER未定义 → 最终使用”Guest”
./demo.sh “Alice” Welcome, Alice 参数优先 → 使用显式传入值

代码中其他参数的解释

通过对第一个参数的解析,其他参数也就知道是什么意思了

1
2
3
MAX_RETRIES=${2:-0}      # 如果没给第2个参数 → 用0(无限重试)
RETRY_INTERVAL=${3:-1} # 如果没给第3个参数 → 用1秒
VERBOSE=${4:-false} # 如果没给第4个参数 → 用false

支持多种调用方式

1
2
3
4
5
6
7
8
# 基础用法(使用所有默认值)
./check_net.sh

# 只指定目标IP(其他用默认值)
./check_net.sh 192.168.1.1

# 指定所有参数
./check_net.sh 192.168.1.1 10 2 true

Shell的参数替换
https://sunshinechen.cn/2025/11/27/Shell的参数替换/
作者
sunshine
发布于
2025年11月27日
许可协议