You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bash多行定义EXCEPTLIST变量及@(${})语法含义咨询

问题解答

一、多行定义EXCEPTLIST变量的可行方式

当需要维护大量服务器名称时,完全可以用多行方式定义EXCEPTLIST,以下是两种可靠实现:

1. 反斜杠续行法

用反斜杠\标记行延续,注意反斜杠后必须直接跟换行(不能有多余空格),最终变量会自动合并为单行竖线分隔的字符串:

EXCEPTLIST="desktop-01|desktop-02|desktop-03| \
desktop-04|desktop-05|desktop-06| \
desktop-07|desktop-08"

这种方式和单行定义效果完全一致,只是排版更易读。

2. 数组转字符串法(更推荐)

如果条目数量极多,用数组单独存储每个条目再转换为竖线分隔的字符串,维护性更强:

# 数组每行存储一个服务器名,无需关心分隔符
EXCEPTLIST_ARRAY=(
    desktop-01
    desktop-02
    desktop-03
    desktop-04
    desktop-05
    desktop-06
    desktop-07
    desktop-08
)
# 将数组元素用|连接生成目标字符串
EXCEPTLIST=$(printf "%s|" "${EXCEPTLIST_ARRAY[@]}")
# 移除最后一个多余的|符号
EXCEPTLIST=${EXCEPTLIST%|}

这种方式修改条目时无需调整分隔符,不容易出错。

二、@(...)语法的术语与原理

术语名称

这个语法不属于变量展开,它是Bash的**扩展模式(Extended Pattern Matching)**中的一种,具体称为“可选模式列表”。

工作原理

在[[ ]]条件判断结构中,Bash支持扩展模式匹配。@(pattern1|pattern2|...)表示匹配竖线分隔的任意一个模式。

你的代码中:

if [[ $vmname != @(${EXCEPTLIST}) ]]; then

执行流程为:

  1. 先完成${EXCEPTLIST}的变量展开,得到desktop-01|desktop-02|...的字符串;
  2. @(...)将展开后的字符串解析为多个可选匹配模式;
  3. 条件判断$vmname是否不等于这些模式中的任意一个,从而实现“不在排除列表”的逻辑。

补充说明

  • 扩展模式默认通常已开启,若未启用可通过shopt -s extglob命令开启;
  • 扩展模式还包括其他语法:*(...)(匹配零次或多次)、+(...)(匹配一次或多次)、?(...)(匹配零次或一次)、!(...)(匹配除指定模式外的任意内容)。

内容的提问来源于stack exchange,提问作者SAGAR BHOOSHAN

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 02:25:15