参数替换
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"} MAX_RETRIES=${2:-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:不传参数
情况2:传入空字符串
情况3:传入有效值
1 2
| ./check_net.sh "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} RETRY_INTERVAL=${3:-1} VERBOSE=${4:-false}
|
支持多种调用方式
1 2 3 4 5 6 7 8
| ./check_net.sh
./check_net.sh 192.168.1.1
./check_net.sh 192.168.1.1 10 2 true
|